web-dev-qa-db-fra.com

Utilisation de la commande find dans le script bash

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?

20
justuser

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.

34
ghoti

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

8
Vivek Sethi

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.

3
ash108