Vous pouvez être intéressé par «le pauvre find
»:
shopt -s globstar
shopt -s
s ÉTS l'option shell nommé (s). L' globstar
option est définie comme suit dans bash (1) :
S'il est défini, le modèle **
utilisé dans un contexte d'expansion de nom de fichier / chemin correspondra à un fichier [sic] et à zéro ou plusieurs répertoires et sous-répertoires. Si le modèle est suivi de a /
, seuls les répertoires et sous-répertoires correspondent.
Donc, après avoir terminé shopt -s globstar
, l'une des commandes suivantes:
ls -d1 - source / ** # Le caractère après le «d» est le chiffre un.
ls -d - source / ** | cat # ie, il écrira cela dans un tube vers n'importe quelle commande.
printf "% s \ n" source / **
produira la sortie:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Malheureusement, cela inclut également les noms de répertoire. Cela pourrait vous aider un peu à savoir que
printf "%s\n" source/**/
produira la sortie:
source/
source/fonts
source/images
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
ls -d --file-type -- source/** | grep -v '/$'
L' --file-type
option indique ls
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:
source // # Ajout d'une
source supplémentaire / polices / # Ajout d'une
source / polices / fontello
source / images / # Ajout d'un
source / images / bg1.png
source / images / eng.png
source / images / fra.png
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 de ls
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 avec sed
:
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
Si vous voulez faire quelque chose avec tous les fichiers (et seulement les fichiers), vous pouvez le faire
pour f dans la source / **
faire
si [-f "$ f"]
ensuite
Insérez ici les commandes à appliquer aux fichiers simples.
Fi
terminé
Remarques:
- Quand
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.
- Vous n'avez probablement pas vraiment besoin de
--
dans les ls
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 -
.
- N'essayez pas d'analyser la sortie de
ls
.
- L'
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'un bash
isme, méfiez-vous - il pourrait ne pas être présent dans toutes les versions de bash.
Si fonts
ou images
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 est
ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
qui supprime les lignes contenant trois caractères ou plus /
.
find
mal; en particulier, si vous courezfor file in $(find ...)
, vous en avez frappé un).