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