Использование команды find в сценарии bash

Я просто начинаю использовать скрипт bash, и мне нужно использовать команду find с более чем одним типом файла.

list=$(find /home/user/Desktop -name '*.pdf') 

этот код работает для типа pdf, но я хочу искать более одного типа файлов, например.txt или.bmp. Есть ли у вас какая-нибудь идея?

Ответ 1

Добро пожаловать в bash. Это старая, темная и таинственная вещь, способная к великой магии. :-)

Опция, о которой вы спрашиваете, предназначена для команды find но не для bash. Из командной строки вы можете man find нужные параметры.

Тот, который вы ищете, - -o для "или":

  list="$(find /home/user/Desktop -name '*.bmp' -o -name '*.txt')"

Тем не менее... Не делай этого. Такое хранилище может работать для простых имен файлов, но как только вам придется иметь дело со специальными символами, такими как пробелы и новые строки, все ставки отключены. Подробнее см. ParsingLs.

$ 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

Расширение пути (globbing) обеспечивает гораздо лучший/безопасный способ отслеживания файлов. Затем вы также можете использовать массивы 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

В FAQ Bash есть много других отличных советов о программировании в bash.

Ответ 3

Вы можете использовать это:

list=$(find /home/user/Desktop -name '*.pdf' -o -name '*.txt' -o -name '*.bmp')

Кроме того, вы можете использовать -iname вместо -name чтобы поймать файлы с расширением ".PDF" (верхний регистр).