2011-12-14 11 views
14

Ho appena iniziato a utilizzare lo script di bash e ho bisogno di utilizzare il comando find con più di un tipo di file.Utilizzo del comando find in bash script

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

questo lavoro di codice per il tipo pdf, ma voglio cercare più di un tipo di file come .txt o .bmp together.Have qualche idea?

risposta

19

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.

3

È possibile utilizzare questo:

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

Inoltre, si potrebbe desiderare di utilizzare -iname invece di -name per prendere i file con ".PDF" (maiuscole) estensione pure.

+2

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