Si je tape:
ls source/*
source/fonts:
fontello
source/images:
bg1.png eng.png fra.png
J'obtiens la liste des fichiers, regroupés par nom de dossier. Comment puis-je simplement obtenir la liste des noms de fichiers?
ls source/*
source/fonts/fontello
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Merci
find
mal; en particulier, si vous courezfor file in $(find ...)
, vous en avez frappé un).Réponses:
Cela ne semble pas possible sans modification de la sortie, mais voici une alternative simple:
Ou (spécifique à GNU find), pour obtenir uniquement des fichiers en profondeur dans votre question:
(ou si vous voulez des répertoires comme
ls
vous donne, supprimez-type f
)la source
Vous pouvez simplement vous en tenir à ls si vous ajoutez des psychédéliques (
ls -d
):la source
find
est toujours une grosse bête.Vous pouvez être intéressé par «le pauvre
find
»:shopt -s
s ÉTS l'option shell nommé (s). L'globstar
option est définie comme suit dans bash (1) :Donc, après avoir terminé
shopt -s globstar
, l'une des commandes suivantes:produira la sortie:
Malheureusement, cela inclut également les noms de répertoire. Cela pourrait vous aider un peu à savoir que
produira la sortie:
c'est-à-dire uniquement les noms de répertoire. Vous pouvez rediriger la sortie de l' un des premier jeu de commandes à un fichier, rediriger la sortie de ce qui précède à un second fichier, puis utiliser
comm
,diff
ou quelque chose de similaire, pour soustraire le second fichier à partir du premier, ne laissant que la plaine fichiers (non-répertoires). Mais ne fais pas ça.Une autre approche (ce n'est pas beaucoup mieux) est
L'
--file-type
option indiquels
d'afficher un/
à la fin de chaque nom de répertoire (et d'autres caractères à la fin d'autres types de fichiers (spéciaux)), comme ceci:puis le
grep -v '/$'
supprime les lignes qui se terminent par/
; c'est-à-dire les noms de répertoire. Malheureusement, l'--file-type
option n'est pas spécifiée par POSIX . Si votre version dels
ne la prend pas en charge, utilisez-F
. C'est comme--file-type
sauf qu'il affiche également un*
à la fin des noms des fichiers exécutables, ce que certaines personnes trouvent ennuyeux. Vous pouvez les éliminer avecsed
:Si vous voulez faire quelque chose avec tous les fichiers (et seulement les fichiers), vous pouvez le faire
Remarques:
ls
est sorti sur un terminal, et qu'il n'est pas en mode-l
( l ong), il écrit plusieurs noms par ligne (sauf si les noms sont très longs). Vous pouvez le forcer à écrire un nom par ligne en spécifiant-1
(un) ou en redirigeant la sortie vers un fichier ou un canal.--
dans lesls
commandes car vous listez un répertoire dont vous avez créé le contenu. Vous devez l'utiliser lors de l'inscription*
dans un répertoire inconnu, comme protection contre les noms de fichiers commençant par-
.ls
.globstar
option shell ne semble pas être définie par POSIX. (En fait, je ne suis pas sûr que POSIX reconnaisse les options du shell.) Bien qu'il semble s'agir d'unbash
isme, méfiez-vous - il pourrait ne pas être présent dans toutes les versions de bash.Si
fonts
ouimages
a des sous-répertoires,**
les énumérera tous, récursivement, tout en bas. Une façon (quelque peu maladroite et peu fiable) de limiter la profondeur estqui supprime les lignes contenant trois caractères ou plus
/
.la source