2011-12-14 38 views
14

Acabo de empezar a usar el script bash y necesito usar el comando find con más de un tipo de archivo.Usando el comando find en el script bash

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

funciona este código para el tipo pdf, pero quiero buscar más de un tipo de archivo como .txt o .bmp together.Have alguna idea?

Respuesta

19

Bienvenido a bash. Es una cosa antigua, oscura y misteriosa, capaz de gran magia. :-)

La opción que está preguntando es para el comando find, no para bash. Desde su línea de comando, puede man find para ver las opciones.

el que usted está buscando es -o a favor "o":

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

Eso dijo ... No haga esto. Este tipo de almacenamiento puede funcionar para nombres de archivo simples, pero tan pronto como tenga que tratar con caracteres especiales, como espacios y líneas nuevas, todas las apuestas estarán desactivadas. Vea ParsingLs para más detalles.

$ 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 

Pathname expansion (globbing) proporciona una manera mucho mejor/más segura de realizar un seguimiento de los archivos. A continuación, también se puede utilizar matrices de 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 

El Bash FAQ tiene un montón de otros consejos excelentes acerca de la programación en bash.

3

Puede utilizar esta:

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

Además, es posible que desee utilizar en lugar de -iname-name para coger los archivos con ".PDF" (en mayúsculas) de extensión también.

+2

Para hacer frente a los nombres de archivo con espacios tendrá que usar comillas para el ' $ list' variable más tarde, como en 'for i in" $ list "; hacer eco $ i; hecho'. Sin comillas dobles, su script considerará cada "nombre de archivo como this.jpg" como tres archivos: "nombre de archivo", "me gusta" y "este.jpg". – ash108

Cuestiones relacionadas