Come eseguo un comando in cui si trova un file?
Considera che ho una directory denominata testdir che contiene quanto segue:
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf
Ora voglio eseguire un'azione (eseguire un comando) in cui find trova un determinato file/tipo di file. Ad esempio fammi trovare *.pdf :
$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf
Supponiamo ora di voler eseguire un comando (ad esempio, dì touch file ) dove il comando precedente trova i file. In altre parole, voglio creare un file chiamato file in ogni directory in cui almeno un .pdf è stato trovato in modo da ottenere:
$ ls -R testdir/
testdir/:
dir1 dir2 dir3 dir4 dir5
testdir/dir1:
doc1.pdf file
testdir/dir2:
file1.txt
testdir/dir3:
doc2.pdf file
testdir/dir4:
file2.txt
testdir/dir5:
doc5.pdf file
Come faccio a realizzare un lavoro del genere?
Può essere per ogni file trovato, cd dove esiste il file ed esegui un comando in modo ricorsivo.
So che find ha una fantastica funzionalità:-exec ma non riesco a farlo funzionare.
Questo è solo un esempio per farmi un'idea di quello che voglio fare. In generale:come eseguire un comando in cui si trovano i file (tramite find ) ricorsivamente?
Risposta accettata:
Se esegui questo comando, il tuo touch file verrà eseguito, potenzialmente più volte, dalla directory in cui è stato avviato il comando:
find -name '*.pdf' -exec touch file ;
D'altra parte, se esegui questa variante, ogni istanza del comando verrà eseguita nella directory del file di destinazione:
find -name '*.pdf' -execdir touch file ;
In entrambi i casi puoi vederlo in azione sostituendo il touch file con echo {} e/o pwd .
Dalla pagina man:
-execdir command ; -execdir command {} +
- Come
-exec , ma il comando specificato viene eseguito dalla sottodirectory contenente il file corrispondente, che normalmente non è la directory in cui hai avviato find .