Si vous êtes à la recherche de fichiers dans un répertoire, pas dans les répertoires imbriqués, vous pouvez utiliser un argument glob à votre commande, qui sera interprété par le shell et produire un argument à votre commande pour chaque correspondance nom:
$ echo *.txt
file1.txt file2.txt file3.txt
Si vous cherchez des fichiers imbriqués arbitrairement profondément dans les sous-répertoires, find
est en effet ce que vous recherchez. Vous devez passer dans le répertoire que vous recherchez, et utiliser le paramètre -name
avec une expression glob citée pour trouver les fichiers appropriés (si le glob n'est pas cité, le shell essayera de l'interpréter, et substituera une liste de fichiers correspondants ce nom dans le répertoire courant, ce qui est ce que vous voulez):
$ find . -name "*.txt"
file1.txt. file2.txt file3.txt subdir/file.txt
Si vous voulez passer ceux-ci comme arguments à une autre fonction, vous pouvez utiliser $()
(ce qui équivaut aux backquotes plus familiers ``
) ,
echo $(find . -name "*.txt")
Ou si vous allez obtenir une liste trop longue f Vous pouvez utiliser xargs
, qui divise son entrée en blocs, chacun étant suffisamment petit pour être transmis à une commande.
find . -name "*.txt" | xargs echo
Si vos noms de fichiers contiennent des espaces, puis xargs
va les diviser en deux morceaux, traiter chacun comme un argument séparé, ce qui est pas ce que vous voulez. Vous pouvez éviter cela en utilisant le caractère nul, 0
, en tant que délimiteur, avec l'argument -print0
à find
et l'argument -0
à xargs
.
find . -name "*.txt" -print0 | xargs -0 echo
xargs - c'était la commande que je cherchais ;-). Je pensais à un millier de commandes (pas vraiment, mais vous le savez), mais je ne pouvais pas me souvenir de cette minuscule ... – friedkiwi