Comando Linux: busque archivos y ejecute comandos en ellos

16

¿Cómo logro encontrar todos los archivos en un directorio y subdirectorios y ejecutar un comando en ellos?

Por ejemplo,

find . -type f -name "*.txt" 

encuentra todos los archivos txt y:

find . -type f -name "*.txt" | gedit

lo envía a gedit, pero dentro de un archivo de texto. Quiero que gedit abra todos los archivos de texto.

xyz
fuente

Respuestas:

22

Puede usar la -execbandera para ejecutar un comando en cada archivo coincidente:

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;

Sintaxis

La sintaxis es un poco extraña (consulte -exec command ;las páginas de manual para obtener más información):

The string `{}' is replaced by the current file name being processed

También es posible que desee considerar -execdir, lo que hará lo mismo, pero ejecuta el comando desde el subdirectorio que contiene el archivo coincidente (esto generalmente es preferible).

David Cain
fuente
1
Gracias. Veo que funciona. Pero, ¿qué significa el final ("{}" \ :)? ejecutar lista?
1
El {}sustituye al nombre del archivo actual y el punto y coma se acaba de terminación del comando. La barra invertida y las comillas circundantes son solo para evitar la expansión del shell.
David Cain
5

find . -type f -name "*.txt" -print0 | xargs -0 gedit

No en lista
fuente
Gracias. Veo que funciona. Pero, ¿qué significa el -print0 | xargs -0 parte significa?
1
@xyz, puede leer acerca de las banderas de cualquier comando UNIX utilizando las páginas man. Intente man findo man xargs, luego, /para buscar una bandera determinada. La documentación es bastante buena, debería responder a sus preguntas.
David Cain
1
-print0imprime un carácter NULL después de cada entrada, -0espera que las entradas estén separadas por un carácter NULL. Es la forma más segura de manejar nombres complicados.
Notinlist
Y no es un poco extraño que la sintaxis no sea gedit xargs -0 en lugar de xargs -0 gedit. Veo que lo primero no funciona, pero no veo por qué.
3
xargs es preferible a -exec por razones de rendimiento ya que xargs puede "agrupar" varios argumentos antes de pasarlos a gedit. Si necesita ejecutar gedit en cada archivo individualmente, reemplace '... -print0 | xargs -0 gedit 'con' ... -print0 | xargs -0 -i gedit {} 'xargs es uno de esos comandos como buscar y pantalla que nunca sabes cómo te llevas sin un año después de que lo aprendas.
luz de arco