Trova -exec dry run?

Dec 27 2020

C'è un modo per vedere quale find . -exec somecommand {} \;sarebbe il risultato di a con le sostituzioni, senza eseguire effettivamente i comandi? Ti piace una corsa a secco (o una prova o una stampa)?

Ad esempio, supponiamo di avere la seguente struttura di file:

/a/1.txt
/a/2.txt
/a/b/3.txt

C'è un modo per testare find . type f -exec rm {} \;dall'interno della adirectory in modo tale che l'output venga stampato su stdout ma non eseguito come:

rm 1.txt
rm 2.txt
rm b/3.txt

Nota di aggiornamento : rmè solo un comando di esempio, mi interessa il caso generale

Risposte

18 rAlen Dec 27 2020 at 07:10

Puoi correre echo rminvece dirm

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

Inoltre, findha la -deletepossibilità di eliminare i file che trova

3 l0b0 Dec 27 2020 at 07:28

In rmparticolare, non è necessario -exec: eseguire semplicemente find . -type fl'elenco e aggiungere -deleteper eliminare i file elencati dal comando precedente (ovviamente escludendo eventuali file corrispondenti creati / eliminati nel frattempo).

Inoltre, per comandi come quelli rmche richiedono un numero arbitrario di argomenti che vorrai sostituire \;con +per eseguire il minor numero di comandi possibile.

2 CharlesDuffy Dec 28 2020 at 00:38

È un po 'un boccone, ma a differenza degli approcci che utilizzano echo, il codice di output di seguito che potresti eseguire nella tua shell senza alcuna modifica per avere il risultato corretto, anche quando i nomi dei file contengono virgolette, spazi, metacaratteri della shell, ecc.

printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
  somecommand {} \;

Notare che la stringa che stiamo anteponendo al nostro -execargomento è precisamente bash -c "$(declare -f printcmd); "'printcmd "$@"' _- l' $(declare -f printcmd)espansione al codice per la funzione; dopodiché, chiamiamo effettivamente la funzione con argomenti $1e avanti, e mettiamo _come segnaposto per $0.

Puoi sostituire zsho kshinvece di bash, se vuoi che l'output di quella shell sia sottoposto a escape.