Benvenuti in bash. È una cosa vecchia, oscura e misteriosa, capace di grande magia. :-)
L'opzione che stai chiedendo è per il comando find
, non per bash. Dalla riga di comando, è possibile man find
per visualizzare le opzioni.
Quello che stai cercando è -o
per "o":
list="$(find /home/user/Desktop -name '*.bmp' -o -name '*.txt')"
Detto questo ... Non fare questo. Archiviazione come questa può funzionare per nomi di file semplici, ma non appena si ha a che fare con caratteri speciali, come spazi e newline, tutte le scommesse sono disattivate. Vedi ParsingLs per i dettagli.
$ 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'espansione del percorso (globbing) fornisce un modo molto migliore/più sicuro per tenere traccia dei file. Poi si può anche utilizzare le matrici 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
Il Bash FAQ ha un sacco di altri ottimi suggerimenti sulla programmazione in bash.
Per far fronte a nomi di file con spazi è necessario utilizzare le virgolette per il ' $ lista' variabile in seguito, come in 'for i in" $ list "; fai eco $ i; done'. Senza virgolette il tuo script considererà ogni "nomefile come questo.jpg" come tre file: "nomefile", "mi piace" e "this.jpg". – ash108