Trova -exec dry run?
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
Puoi correre echo rminvece dirm
find . type f -exec echo rm {} \;
Inoltre, findha la -deletepossibilità di eliminare i file che trova
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.
È 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.