GNU/Linux >> Tutoriales Linux >  >> Linux

¿Ejecutar un comando donde se encuentra un archivo?

¿Cómo ejecuto un comando donde se encuentra un archivo?
Considere que tengo un directorio llamado testdir que contiene lo siguiente:

$ 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

Ahora quiero realizar una acción (ejecutar un comando) donde find encuentra un determinado archivo/tipo de archivo. Por ejemplo, déjame encontrar *.pdf :

$ find . -name '*.pdf'
./testdir/dir3/doc2.pdf
./testdir/dir5/doc5.pdf
./testdir/dir1/doc1.pdf

Ahora suponga que quiero ejecutar un comando (por ejemplo, diga touch file ) donde el comando anterior encuentra archivos. En otras palabras, quiero crear un archivo llamado file en cada directorio donde al menos un .pdf fue encontrado por lo que obtengo:

$ 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

¿Cómo logro tal trabajo?
Puede ser por cada vez que se encuentre un archivo, cd a donde existe el archivo y ejecutar un comando recursivamente.
Sé que find tiene una característica increíble:-exec pero no puedo hacer que funcione.

Este es solo un ejemplo para tener una idea de lo que quiero hacer. En términos generales:cómo ejecutar un comando donde se encuentran los archivos (mediante find ) recursivamente?

Respuesta aceptada:

Si ejecuta este comando, su touch file se ejecutará, posiblemente varias veces, desde el directorio en el que se inició el comando:

find -name '*.pdf' -exec touch file ;

Por otro lado, si ejecuta esta variante, cada instancia del comando se ejecutará en el directorio del archivo de destino:

find -name '*.pdf' -execdir touch file ;

En ambos casos, puede ver esto en acción sustituyendo el touch file con echo {} y/o pwd .

De la página de manual:

-execdir command ;
-execdir command {} +

    Me gusta -exec , pero el comando especificado se ejecuta desde el subdirectorio que contiene el archivo coincidente, que normalmente no es el directorio en el que inició find .


Linux
  1. mkfs.hfsplus:comando no encontrado

  2. dos2unix:comando no encontrado

  3. rm:comando no encontrado

  4. toque:comando no encontrado

  5. mv:comando no encontrado

df:comando no encontrado

du:comando no encontrado

archivo:comando no encontrado

tune2fs:comando no encontrado

fsck:comando no encontrado

cola:comando no encontrado