Toutes les réponses apportées jusqu'à présent sont basées sur le fait que les fichiers (ou répertoires) dont le nom commence par un point sont "cachés". J'ai trouvé une autre solution, qui n'est peut-être pas aussi efficace, mais cette solution ne suppose rien sur les noms des fichiers cachés, et évite donc d'énumérer ..
dans le résultat (comme le fait la réponse actuellement acceptée).
La commande complète est :
ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)
Explication
Cela permet de lister deux fois tous les fichiers (et répertoires),
echo -e "$(\ls)\n$(\ls -A)"
mais ne montre les fichiers cachés qu'une seule fois -A
.
Ensuite, la liste est triée | sort
qui fait apparaître les fichiers normaux (non cachés) deux fois et les uns à côté des autres.
Ensuite, supprimez toutes les lignes qui apparaissent plus d'une fois. | uniq -u
en ne laissant que des lignes uniques.
Enfin, utilisez ls
à nouveau pour lister tous les fichiers avec les options personnalisées de l'utilisateur et sans lister le contenu des répertoires dans la liste. -d
.
EDIT (Limitations) :
Comme muru l'a souligné, cette solution ne fonctionnera pas correctement s'il y a des fichiers avec des noms tels que escaped\ncharacter.txt
parce que echo -e
divisera le nom du fichier en deux lignes. Il ne fonctionnera pas non plus comme prévu s'il y a deux fichiers cachés avec presque le même nom, à l'exception d'un caractère spécial, tel que .foo[tab].txt
y .foo[new-line].txt
car les deux sont imprimés comme .foo?.txt
et serait éliminé par uniq -u