Trouver -exec dry run?
Existe-t-il un moyen de voir quel find . -exec somecommand {} \;
serait le résultat d'un a avec des substitutions, sans réellement exécuter les commandes? Comme un essai à sec (ou un essai ou une impression)?
Par exemple, supposons que j'ai la structure de fichiers suivante:
/a/1.txt
/a/2.txt
/a/b/3.txt
Existe-t-il un moyen de tester à find . type f -exec rm {} \;
partir du a
répertoire de sorte que la sortie soit imprimée sur stdout mais non exécutée, par exemple:
rm 1.txt
rm 2.txt
rm b/3.txt
Note de mise à jour : rm
est juste un exemple de commande, je suis intéressé par le cas général
Réponses
Vous pouvez courir echo rm
au lieu derm
find . type f -exec echo rm {} \;
En outre, find
a l' -delete
option pour supprimer les fichiers qu'il trouve
Pour plus rm
précisément, vous n'avez pas besoin -exec
: exécutez simplement find . -type f
pour lister et ajoutez -delete
pour supprimer les fichiers répertoriés par la commande précédente (en excluant évidemment tout fichier correspondant créé / supprimé entre-temps).
De plus, pour des commandes comme celles rm
qui prennent un nombre arbitraire d'arguments, vous voudrez les remplacer \;
par +
pour exécuter le moins de commandes possible.
C'est un peu une bouchée, mais contrairement aux approches utilisant echo
, le code ci-dessous génère du code que vous pouvez exécuter dans votre shell sans aucune modification pour obtenir le résultat correct, même lorsque vos noms de fichiers contiennent des guillemets, des espaces, des métacaractères du shell, etc.
printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
Notez que la chaîne que nous ajoutons au début de notre -exec
argument est précisément bash -c "$(declare -f printcmd); "'printcmd "$@"' _
- le se $(declare -f printcmd)
développe au code de la fonction; après cela, nous appelons en fait la fonction avec des arguments $1
et en avant, et la plaçons _
comme espace réservé pour $0
.
Vous pouvez remplacer zsh
ou à la ksh
place de bash, si vous voulez que la sortie soit échappée pour ce shell.