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 aVerzeichnis 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: rmist nur ein Beispielbefehl, ich interessiere mich für den allgemeinen Fall
Antworten
Sie können laufen echo rmstattrm
find . type f -exec echo rm {} \;
Hat auch finddie -deleteOption, gefundene Dateien zu löschen
Für rmInsbesondere brauchen Sie nicht -exec: einfach laufen find . -type fzur Liste, und fügen Sie -deletedie 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 rmdenen 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 echogibt 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 -execArgument 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 $1und weiter auf und setzen sie _als Platzhalter für $0.
Sie können zshoder kshanstelle von Bash ersetzen , wenn die Ausgabe für diese Shell maskiert werden soll.