Finden Sie -exec Trockenlauf?

Dec 27 2020

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

18 rAlen Dec 27 2020 at 07:10

Sie können laufen echo rmstattrm

find . type f -exec echo rm {} \;

Hat auch finddie -deleteOption, gefundene Dateien zu löschen

3 l0b0 Dec 27 2020 at 07:28

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.

2 CharlesDuffy Dec 28 2020 at 00:38

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.