Come fare un per loop di nomi di file con spazi che utilizzano la ricerca

Ho il seguente script – il suo dovrebbe lanciare i nomi di file utilizzando la ricerca ma si cucita per rompere i file nomi da uno spazio? Ho bisogno che i nomi dei file rimangano intatti

#!/bin/bash for file in `find -name "*.avi"` do ./myscript $file done 

Qualcuno può aiutarmi?

Grazie

4 Solutions collect form web for “Come fare un per loop di nomi di file con spazi che utilizzano la ricerca”

 find -name "*.avi" -print0 | xargs -0 -n 1 echo 

Non devi echo in xargs :

 find -name "*.avi" -print0 | xargs -0 -n 1 ./myscript 

Inoltre: find -name "*.avi" -exec ./myscript '{}' \;

La risposta di Womble funziona sicuramente nella maggior parte dei casi, ma Xargs non è perfetto con spazi in tutte le implementazioni. Non ho mai trovato la modalità di esecuzione di trovare per rompere. Solaris era particolarmente cranky in questo senso.

Ovviamente, il '-print' sarebbe meglio per generare semplicemente l'output per un elenco di file in una per il loop. Ma se stai eseguendo un command su un elenco di file, è più efficiente eseguire semplicemente l'opzione '-exec'.

Se non hai bisogno di ricorsioni:

 #!/bin/bash for file in *.avi do ./myscript "$file" done 

Si noti che le virgolette intorno alla variabile sono essenziali.

Edit:

Come dice kiro, se hai bisogno di ricorsione e hai Bash 4, puoi aggiungere shopt -s globstar e cambiare il glob a **/*.avi .

Oltre alle soluzioni basate su xargs e il find -exec c'è anche l'opzione di piping per leggere. Ha il vantaggio di consentire di strutturare il tuo script in modo più classico. Permettethemes di applicarlo al tuo esempio.

 find -name "*.avi" | while read avifile; do ./myscript "$avifile" done 
Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.