Использование команды find в скрипте bash - PullRequest
20 голосов
/ 14 декабря 2011

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

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

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

Ответы [ 3 ]

33 голосов
/ 14 декабря 2011

Добро пожаловать в 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

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

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

8 голосов
/ 09 апреля 2015

Если вы хотите перебрать то, что «нашли», вы должны использовать это:

find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
    printf '%s\n' "$file"
done

Источник: https://askubuntu.com/questions/343727/filenames-with-spaces-breaking-for-loop-find-command

3 голосов
/ 14 декабря 2011

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

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

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

...