2010-01-18 11 views
35

Estoy tratando de usar una matriz para almacenar una lista de nombres de archivos usando el comando find.¿Cómo puedo procesar los resultados de find en un script bash?

Por alguna razón, la matriz no funciona en el bash utilizado por la escuela, aunque mi programa funciona en mi propia computadora portátil.

así que me preguntaba si hay otra manera de hacerlo, esto es lo que tengo:

array = (`find . -name "*.txt"`) #this will store all the .txt files into the array 

Entonces puede acceder a los elementos de la matriz y hacer una copia de todos los archivos usando el comando cat.

¿Hay alguna otra manera de hacerlo sin usar una matriz?

Respuesta

75

Usted podría utilizar algo así:

find . -name '*.txt' | while read line; do 
    echo "Processing file '$line'" 
done 

P. ej hacer una copia:

find . -name '*.txt' | while read line; do 
    echo "Copying '$line' to /tmp" 
    cp -- "$line" /tmp 
done 

HTH

+0

muchas gracias !! funcionó y aprendí algo nuevo – Shellscriptbeginner

+0

Usar un bucle 'for' es definitivamente una mejor opción aquí. Usar una matriz funcionaría, excepto que lee toda la lista en una variable y luego itera sobre la variable. Esta versión lee cada nombre de archivo como viene de 'find' y lo procesa en línea. –

+0

D.Shawley, ¿podría publicar una muestra con un bucle for? También debería funcionar para archivos con espacios en el nombre, creo. –

2
find . -name '*.txt' | while IFS= read -r FILE; do 
    echo "Copying $FILE.." 
    cp "$FILE" /destination 
done 
6

Simplemente no poner espacios en blanco alrededor del signo igual:

ar=($(find . -name "*.txt")) 

Evitar acentos abiertos, si es posible, ya que están en desuso. Se pueden confundir fácilmente con el apostrofismo, especialmente en fuentes pobres, y no anidan tan bien.

En la mayoría de los casos, será mejor si itera a través de un resultado de búsqueda directamente con -exec, -execdir, -ok o -okdir.

Para y cuando los bucles son difíciles de hacer bien cuando se trata de espacios en blanco en nombres de archivo o nuevas líneas y pestañas.

find ./ -name "*.txt" -exec grep {} ";" 

{} no necesita enmascaramiento. Usted verá a menudo una combinación encontrar/xargs que se inicia un proceso adicional también:

find ./ -name "*.txt" | xargs grep {} ";" 
14

que estaba teniendo problema con la solución de Johannes Weiß, si yo estaba haciendo un eco que trabajaría para la lista completa de los archivos. Sin embargo, si intenté ejecutar ffmpeg en la siguiente línea, el script solo procesaría el primer archivo que encontrara. Asumí algunos negocios divertidos de IFS debido a la tubería pero no pude resolverlo y ejecuté con un bucle for en su lugar:

for i in $(find . -name '*.mov'); 
do 
    echo "$i" 
done 
+1

Esto falla para espacios en blanco en nombres de archivos – spinup

Cuestiones relacionadas