2010-01-18 15 views
35

Sto tentando di utilizzare una matrice per memorizzare un elenco di nomi file utilizzando il comando find.Come posso elaborare i risultati di find in uno script bash?

Per qualche motivo l'array non funziona nella bash utilizzata dalla scuola, il mio programma funziona comunque sul mio portatile.

quindi mi chiedevo se c'è un altro modo per farlo, questo è quello che ho:

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

allora posso accedere agli elementi di matrice e fare un copia di tutti i file utilizzando il comando cat.

C'è un altro modo per farlo senza utilizzare un array?

risposta

75

Si potrebbe usare qualcosa di simile:

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

Ad es fare una copia:

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

HTH

+0

grazie mille !! ha funzionato e ho imparato qualcosa di nuovo – Shellscriptbeginner

+0

L'utilizzo di un ciclo 'for' è sicuramente una scelta migliore qui. L'utilizzo di un array potrebbe funzionare tranne che legge l'intera lista in una variabile e quindi scorre sulla variabile. Questa versione legge ogni nome di file come viene da 'find' e lo elabora in linea. –

+0

D.Shawley, potresti pubblicare un esempio con un ciclo for? Dovrebbe funzionare anche per i file con spazi nel nome, credo. –

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

Basta non mettere spazi vuoti intorno segno di uguale:

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

Evitare backticks, se possibile, dato che sono deprecati. Possono essere facilmente confusi con apostroph, specialmente in caratteri poveri, e non si annidano così bene.

Nella maggior parte dei casi, sarà meglio servire se si scorre un risultato di ricerca direttamente con -exec, -execdir, -ok o -okdir.

Per e while i loop sono difficili da eseguire quando si tratta di spazi nei nomi di file o newline e schede.

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

Il {} non richiede mascheramento. Vedrete spesso una combinazione trovare/xargs che inizia un processo di ulteriore troppo:

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

ho avuto problema con la soluzione di Johannes Weiß, se stavo solo facendo un eco che avrebbe funzionato per l'elenco completo dei file. Tuttavia, se provassi ad eseguire ffmpeg nella riga successiva, lo script processerebbe solo il primo file che incontrava. Ho ipotizzato un po 'di business divertente IFS a causa della pipe ma non sono riuscito a capirlo e ho usato invece un ciclo for:

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

Non riesce per gli spazi nei nomi dei file – spinup

Problemi correlati