Como posso editar todos os arquivos retornados por find in vi no Linux?

22

Algo que me vejo fazendo muito é executar um comando find e depois editar todos eles no vi, algo parecido com isto:

> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt

> vi ./file1.txt ./file2.txt ./path/to/file3.txt

Existe um inteligente & maneira simples de fazer isso tudo em uma linha de comando?

    
por abeger 15.09.2011 / 17:46

5 respostas

34

Isso deve funcionar:

find . -name "*.txt" -exec vim {} + 

Use Vim, é melhor para sua saúde. : -)

A opção + frequentemente ignorada para -exec faz com que todos os nomes dos arquivos (até os limites de tamanho da linha) apareçam em uma linha, ou seja, você ainda obtém todos os arquivos abertos em um vim session (navegada com :n para o próximo e :N para o arquivo anterior).

Com vim -p você obtém uma guia de arquivo para cada arquivo. Verifique :help tab-page-commands para mais detalhes.

Com vim -o , você obterá janelas divididas horizontalmente para cada arquivo, vim -O dividir verticalmente as janelas. Verifique :help window-move-cursor para mais detalhes.

Observe que a versão anterior dessa resposta, vim $(find . -name "*.txt") , não funciona com espaços em nomes de arquivos e tem implicações de segurança.

Pipar para xargs vi dá um Warning: Input is not from a terminal , mais um terminal com comportamento completamente falso depois. Grawity do usuário explicou porque em um comentário abaixo, e com um pouco mais de explicação em esta questão .

    
por 15.09.2011 / 17:56
4

Ou execute o vim e a partir dele:

:args **/*.txt
    
por 15.09.2011 / 19:53
1

Além disso, se você quiser que eles sejam abertos um de cada vez, você também pode usar find -exec ou usar um loop for simples. Editado por comentário do ceving.

find . -name "*.txt" -exec vi {} \;

ou

OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for i in 'find . -name "*.txt"'
    do
        vi $i
    done
IFS=$OLDIFS
    
por 15.09.2011 / 18:20
0

Se você já tiver digitado o comando find , será muito mais fácil usar xargs para abrir os resultados da pesquisa:

find . -name "*.txt" | xargs vim -p

A opção -p diz ao vim para abrir cada arquivo em uma nova guia. Eu acho isso mais conveniente do que apenas usar buffers, mas se você não fizer isso, basta deixar essa opção.

    
por 14.10.2015 / 23:58
0

Para editar todo o *.txt , basta executar: vim *.txt . Para editar arquivos retornados por find , leia mais.

No Unix / macOS, você pode usar find com BSD xargs (consulte: man xargs ), por exemplo,

find -L . -name "*.txt" -type f -print0 | xargs -o -0 vim

-o (xargs): Reopen stdin as /dev/tty in the child process before executing the command.

Relacionados: Terminal borked após invocar o Vim com xargs no Vim.SE.

    
por 16.11.2017 / 12:47

Tags