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

  • Ricerca non ricorsiva su Linux
  • Come utilizzare il command find per eliminare i file corrispondenti a un pattern?
  • trovare tutte le directory contenenti less di x file all'interno
  • Glob non corrisponde?
  • Come rimuovere la directory sul file system NFS con un enorme numero di file
  • Un migliore trovare unix con elaborazione parallela?
  • command `find` non disponibile nel web host, come implementare un'eliminazione in base al tempo di modifica utilizzando altri comandi?
  • Come trovare i file in un sistema Debian non installato o creato da dpkg?
  • 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.