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