Réponses:
La meilleure façon de le faire est d'utiliser des paramètres de position. Et $()
est préféré pour la substitution de commandes au-dessus des astuces car il est plus lisible (n'est pas confondu avec des guillemets simples) et peut être facilement imbriqué sans avoir à faire beaucoup d'échappement.
find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;
Le trait de soulignement est un espace réservé pour $0
.
Pourquoi?
find ... -printf 'Blah: %m\n'
Ou utilisez bash -c
si vous devez vraiment:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -c
ou similaire.
La seule façon de les utiliser (AFAIK) est de les placer dans un fichier de script bash et d'utiliser le script dans -exec. Même chose avec$()
N'oubliez pas xargs
! Votre exemple invoquerait un nouveau processus shell pour chaque fichier trouvé.
Je préfère ceci:
find ... | xargs stat -c "Blah: %a"
find
affiche une liste de tout ce qui a été trouvé, xargs
lit une liste d'arguments stdin
et exécute son paramètre avec ces arguments sur la ligne de commande, créant une ligne de commande aussi longue que possible. Cela fonctionne parce que stat
, comme la plupart des autres commandes / programmes appropriés, prennent n'importe quel nombre de paramètres. (comparer ls
, rm
et echo
par exemple)
Si vous pensez qu'il est absolument nécessaire de lancer un nouveau processus pour chaque fichier, utilisez xargs -n 1
uniquement pour passer des 1
paramètres à chaque commande. De cette façon, vous pouvez imiter les méthodes inefficaces comme ceci:
find ... | xargs -n 1 stat -c "Blah: %a"
(Essayez-le sur un gros système de fichiers sur un ordinateur lent et chronométrez les différences!)
find
être même exécutés et le résultat est utilisé comme paramètre statique pour la recherche.