Il semble y avoir un certain nombre de façons de le faire, y compris des boucles dans le script shell, find et xargs. Laquelle de ces options est la meilleure et la plus portable?
Il semble y avoir un certain nombre de façons de le faire, y compris des boucles dans le script shell, find et xargs. Laquelle de ces options est la meilleure et la plus portable?
Réponses:
find . -exec <command> {} \;
pour le répertoire courant comme racine de l'arborescence ou en général:
find <directory> -exec <command> {} \;
-name "*.c"
ou par exemple -type d
pour les répertoires ...
find ... | xargs ...
idiome, il traite les fichiers par lots, et cela sera généralement plus rapide (moins de processus lancés).
Utilisez l' -print0
option pour rechercher et l' -0
option pour xargs
si vous avez des noms de fichiers ou de répertoires avec des espaces:
find {dir} -print0 | xargs -0r {command}
L' -print0
option de recherche imprime les noms de fichiers sous NUL
forme de liste séparée plutôt que d'espaces séparés, tandis que l' -0
option de lui xargs
demander de briser son entrée NUL
plutôt que d'espaces. Étant donné que NUL
c'est l'un des caractères qui n'est pas autorisé dans les noms de fichiers Unix, il n'y a aucun moyen de le confondre avec une partie d'un nom de fichier.
L' -r
option est là pour que xargs
cela ne vous donne pas d'erreur si elle n'a pas d'entrée.
Si la portabilité est un problème, je resterais à l'écart des méthodes spécifiques au shell (il y a beaucoup de gens qui utilisent beaucoup de shells différents, mais en général find et xargs sont vraiment des outils de base que personne n'oserait changer radicalement) .
L'utilisation d'arguments de base de find et xargs devrait vous donner une solution plus portable.
Si le regroupement des arguments est acceptable, recherchez | xargs donnera probablement de meilleures performances, car il exécutera la commande beaucoup moins de fois que find -exec. Si vous souhaitez exécuter la commande à chaque fois pour chaque fichier ou l'exécuter dans le sous-répertoire du fichier, vous devez probablement utiliser find -exec ou -execdir.
En règle générale, il est préférable de rester à l'écart des boucles spécifiques au shell; find & xargs sont suffisants pour la plupart des scénarios.
Assurez-vous que la version de la commande que vous utilisez n'a pas déjà d'indicateur pour une opération récursive. :)