2010-02-16 5 views

Répondre

2
find . -type f | while read file; do 
    process "$f" 
done; 
+0

C'est * exactement * ce dont j'avais besoin. Merci! – AdSR

+1

"$ f" devrait être "$ file". Utilisez 'while while read -r' pour prendre un antislash littéral dans les noms de fichiers – ghostdog74

0

Dans ce cas, mon approche est de construire la liste avant la commande for et remplacer les espaces dans les noms d'éléments par un autre caractère ou une chaîne qui est peu susceptible d'apparaître. Puis à l'intérieur de la boucle, je remplace cette chaîne spécifique par un espace blanc.

Un exemple:

list=`find -foo -bar -baz | tr ' ' 'µ'` 
for fx in $list ; do 
    f=`echo $fx | tr 'µ' ' '` 
    process "$f" 
done 
+0

Ceci est détaillé et pas robuste. –

1

Si vous utilisez déjà trouver, pourquoi ne pas utiliser simplement exec

find -foo -bar -baz -exec process '{}' \; 

La solution de rechange serait de changer la variable IFS (inter seperator sur le terrain)

4

Trouvez et xargs fonctionnent bien ensemble. trouver peut imprimer les noms des fichiers avec un \0 -Delimiter (en option print0) et xargs peut les lire dans ce format (en option -0):

find . -type f -print0 | xargs -0 echo 
+1

N'oubliez pas xargs! Sur les listes de très grands nombres de fichiers, vous pouvez vous retrouver avec l'erreur redoutée "Trop d'arguments". Ces deux articles O'Reilly expliquent la situation: http://linuxdevcenter.com/pub/a/linux/lpt/09_21.html http://linuxdevcenter.com/pub/a/linux/lpt/09_22.html – Jim

1

bash 4

shopt -s globstar 
for file in /path/** 
do 
    process "$file" 
done 
Questions connexes