Je commence juste à utiliser le script bash et j'ai besoin d'utiliser la commande find avec plus d'un type de fichier.
list=$(find /home/user/Desktop -name '*.pdf')
ce code fonctionne pour le type pdf mais je veux rechercher plus d'un type de fichier comme .txt ou .bmp ensemble. Avez-vous une idée?
Bienvenue à bash. C'est une chose ancienne, sombre et mystérieuse, capable d'une grande magie. :-)
L'option que vous demandez est pour la commande find
cependant, pas pour bash. Depuis votre ligne de commande, vous pouvez man find
pour voir les options.
Celui que vous recherchez est -o
pour "ou":
list="$(find /home/user/Desktop -name '*.bmp' -o -name '*.txt')"
Cela dit ... Ne faites pas ça. Un stockage comme celui-ci peut fonctionner pour les noms de fichiers simples, mais dès que comme vous devez gérer des caractères spéciaux, comme les espaces et les retours à la ligne, tous les paris sont désactivés. Voir ParsingLs pour plus de détails.
$ touch 'one.txt' 'two three.txt' 'foo.bmp'
$ list="$(find . -name \*.txt -o -name \*.bmp -type f)"
$ for file in $list; do if [ ! -f "$file" ]; then echo "MISSING: $file"; fi; done
MISSING: ./two
MISSING: three.txt
L'expansion du nom de chemin (globbing) fournit un moyen bien meilleur/plus sûr de garder une trace des fichiers. Ensuite, vous pouvez également utiliser des tableaux bash:
$ a=( *.txt *.bmp )
$ declare -p a
declare -a a=([0]="one.txt" [1]="two three.txt" [2]="foo.bmp")
$ for file in "${a[@]}"; do ls -l "$file"; done
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 one.txt
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 two three.txt
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 foo.bmp
Le Bash FAQ a beaucoup d'autres excellents conseils sur la programmation en bash.
Si vous voulez parcourir ce que vous "trouvez", vous devez utiliser ceci:
find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
printf '%s\n' "$file"
done
Source: https://askubuntu.com/questions/343727/filenames-with-spaces-breaking-for-loop-find-command
Vous pouvez utiliser ceci:
list=$(find /home/user/Desktop -name '*.pdf' -o -name '*.txt' -o -name '*.bmp')
En outre, vous souhaiterez peut-être utiliser -iname
au lieu de -name
pour capturer des fichiers avec l'extension ".PDF" (majuscule) également.