2011-12-14 3 views
14

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

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

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

ответ

19

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

$ 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 имеет много других замечательных советов о программировании в Баш.

3

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

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

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

+2

Чтобы справиться с именами файлов с пробелами вам необходимо использовать кавычки для ' $ list', как в 'for i in" $ list "; do echo $ i; done'. Без двойных кавычек ваш скрипт будет рассматривать каждое «filename like this.jpg» как три файла: «filename», «like» и «this.jpg». – ash108

Смежные вопросы