È possibile ottenere backtick di espansione "find -exec" per ogni file trovato?


9

Ecco un comando che funziona bene:

echo Blah: `stat -c %a .`

È possibile find -execeseguire questa stessa cosa per ogni file trovato, con {}al posto di .?


1
I backtick non possono funzionare lì perché vengono valutati una volta prima findancora che vengano eseguiti e il risultato viene utilizzato come parametro statico per find.
Sven

Risposte:


10

Il modo migliore per farlo è utilizzare i parametri posizionali. Ed $()è preferito per i backtick di sostituzione dei comandi perché è più leggibile (non è confuso con virgolette singole) e può essere facilmente nidificato senza dover eseguire molte operazioni di escape.

find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;

Il carattere di sottolineatura è un segnaposto per $0.


6

Per che cosa?

find ... -printf 'Blah: %m\n'

Oppure usa bash -cse devi davvero:

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;

Grazie per aver risolto il mio problema immediato, ma sono ancora curioso di sapere se i backtick possono essere utilizzati come descritto. Solo per allargare i miei orizzonti.
Roman,

Dovresti invocare la shell tramite bash -co simili.
Ignacio Vazquez-Abrams,

0

L'unico modo per usarli (AFAIK) è metterli in un file di script bash e usare lo script in -exec. Stessa cosa con$()


0

Non dimenticare xargs! Il tuo esempio invocherebbe un nuovo processo di shell per ogni file trovato.

Preferirei questo:

find ... | xargs stat -c "Blah: %a"

findgenera un elenco di tutto ciò che è stato trovato, xargslegge un elenco di argomenti stdined esegue il suo parametro con tali argomenti sulla riga di comando, costruendo una riga di comando più lunga possibile. Funziona perché stat, come la maggior parte degli altri comandi / programmi propri, accetta un numero qualsiasi di parametri. (confronta ls, rme echoper esempio)

Se ritieni che sia assolutamente necessario avviare un nuovo processo per ciascun file, utilizza xargs -n 1solo per passare i 1parametri a ciascun comando. In questo modo puoi imitare i metodi inefficienti come questo:

find ... | xargs -n 1 stat -c "Blah: %a"

(Provalo su un grande filesystem su un computer lento e cronometra le differenze!)


Apprezzo lo sforzo, ma ho bisogno di quei backtick. Ovviamente il mio esempio è semplificato e usa echo + stat; il vero script non usa né echo né stat, quindi il tuo trucco nel metterli insieme nella stringa di formato di stat non aiuta affatto.
Roman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.