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
.