GNU/Linux >> Linux Esercitazione >  >> Linux

Eseguire un comando in cui si trova un file?

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 .


Linux
  1. dos2unix:comando non trovato

  2. nano:comando non trovato

  3. chmod:comando non trovato

  4. ordina:comando non trovato

  5. ln:comando non trovato

tune2fs:comando non trovato

fsck:comando non trovato

coda:comando non trovato

rm:comando non trovato

tocco:comando non trovato

mv:comando non trovato