¿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
.