Comando Linux: encontre arquivos e execute o comando neles

16

Como faço para encontrar todos os arquivos em um diretório e subdiretórios e executar um comando neles?

Por exemplo,

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

localiza todos os arquivos txt e:

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

envia para o gedit, mas dentro de um arquivo de texto. Eu quero que o gedit abra todos os arquivos de texto.

xyz
fonte

Respostas:

22

Você pode usar o -execsinalizador para executar um comando em cada arquivo correspondente:

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

Sintaxe

A sintaxe é um pouco estranha (veja mais -exec command ;nas páginas de manual):

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

Você também pode considerar -execdir, o que fará o mesmo, mas executa o comando no subdiretório que contém o arquivo correspondente (geralmente é preferível).

David Cain
fonte
11
Obrigado. Eu vejo que isso funciona. Mas o que significa o fim ("{}" \ :)? executar lista?
11
Ele {}representa o nome do arquivo atual e o ponto e vírgula está terminando o comando. A barra invertida e as aspas circundantes são apenas para impedir a expansão do shell.
David Cain
5

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

Não está na lista
fonte
Obrigado. Eu vejo que isso funciona. Mas o que faz o -print0 | xargs -0 parte significa?
11
@xyz, você pode ler sobre os sinalizadores de qualquer comando UNIX usando as páginas de manual. Experimente man findou man xargs, em seguida, /procure por um determinado sinalizador. A documentação é muito boa, deve responder às suas perguntas.
David Cain
11
-print0imprime um caractere NULL após cada entrada, -0espera que as entradas sejam separadas pelo caractere NULL. É a maneira mais segura de lidar com nomes complicados.
SeNãoEstiverNaLista
E não é um pouco estranho que a sintaxe não seja gedit xargs -0 em vez de xargs -0 gedit. Vejo que o primeiro não funciona, mas falha em entender o porquê.
3
O xargs é preferível ao -exec por motivos de desempenho, pois o xargs pode "agrupar" vários argumentos antes de passá-los ao gedit. Se for necessário executar o gedit em cada arquivo individualmente, substitua '... -print0 | xargs -0 gedit 'com' ... -print0 | xargs -0 -i gedit {} 'xargs é um desses comandos, como localização e tela, que você nunca sabe como se deu bem um ano depois de aprender sobre isso.
Arclight