Finden Sie -exec Trockenlauf?
Gibt es eine Möglichkeit zu sehen, was das Ergebnis von a find . -exec somecommand {} \;
mit Substitutionen wäre, ohne die Befehle tatsächlich auszuführen? Wie ein Trockenlauf (oder Testlauf oder Druck)?
Angenommen, ich habe die folgende Dateistruktur:
/a/1.txt
/a/2.txt
/a/b/3.txt
Gibt es eine Möglichkeit, find . type f -exec rm {} \;
aus dem a
Verzeichnis heraus zu testen, dass die Ausgabe auf stdout gedruckt, aber nicht ausgeführt wird, wie z.
rm 1.txt
rm 2.txt
rm b/3.txt
Update Hinweis: rm
ist nur ein Beispielbefehl, ich interessiere mich für den allgemeinen Fall
Antworten
Sie können laufen echo rm
stattrm
find . type f -exec echo rm {} \;
Hat auch find
die -delete
Option, gefundene Dateien zu löschen
Für rm
Insbesondere brauchen Sie nicht -exec
: einfach laufen find . -type f
zur Liste, und fügen Sie -delete
die Dateien , die von dem vorherigen Befehl aufgelistet löschen (natürlich vorbehältlich passenden Dateien in der Zwischenzeit erstellt / gelöscht werden).
Auch für Befehle wie rm
denen nehmen , eine beliebige Anzahl von Argumenten werden Sie ersetzen möchten \;
mit +
zu laufen so wenige Befehle wie möglich.
Es ist ein bisschen mundvoll, aber im Gegensatz zu den verwendeten Ansätzen echo
gibt der folgende Code aus, den Sie ohne Änderungen in Ihrer Shell ausführen können, um das richtige Ergebnis zu erzielen, selbst wenn Ihre Dateinamen Anführungszeichen, Leerzeichen, Shell-Metazeichen usw. enthalten.
printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
Beachten Sie, dass die Zeichenfolge wir unseren sind vorangestellt -exec
Argument ist genau bash -c "$(declare -f printcmd); "'printcmd "$@"' _
- die sich $(declare -f printcmd)
ausdehnt , um den Code für die Funktion; Danach rufen wir die Funktion tatsächlich mit Argumenten $1
und weiter auf und setzen sie _
als Platzhalter für $0
.
Sie können zsh
oder ksh
anstelle von Bash ersetzen , wenn die Ausgabe für diese Shell maskiert werden soll.