Algo que eu me vejo fazendo muito é executar um comando find e depois editar todos eles no vi, que se parece com isso:
> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt
> vi ./file1.txt ./file2.txt ./path/to/file3.txt
Existe uma maneira inteligente e simples de fazer isso tudo em uma linha de comando?
xargs
destruir o meu terminal. A solução é adequada a uma infra @DevSolarRespostas:
Isso deve fazer o truque:
Use o Vim, é melhor para sua saúde. :-)
A
+
opção muitas vezes esquecida-exec
faz com que todos os nomes de arquivos (até o limite de comprimento da linha) apareçam em uma linha, ou seja, você ainda abre todos os arquivos em umavim
sessão (navegado com o arquivo:n
seguinte e o:N
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
janelas verticalmente divididas. Verifique:help window-move-cursor
para mais detalhes.Observe que a versão anterior desta resposta
vim $(find . -name "*.txt")
,, não funciona com espaços nos nomes de arquivos e tem implicações de segurança.A tubulação no
xargs vi
dá umWarning: Input is not from a terminal
terminal mais um comportamento completamente falso posteriormente. O grawity do usuário explicou o motivo em um comentário abaixo e com um pouco mais de explicação nesta pergunta .fonte
/dev/tty
e chamar ioctl (); é muito preguiçoso fazê-lo.) Quando invocado pelo xargs, o vim recebe/dev/null
como entrada padrão, o que simplesmente ignora os ioctls de controle do terminal.vim -p
se você quiser guias de arquivo. (gt
EgT
para navegar, ou clique com o mouse.)vim
, basta especificar-
como o primeiro argumento, como emecho foobar | vim -
.find . -name "*.txt" | vim -
dá-lhe uma sessão vim em um arquivo sem nome que contém os nomes dos arquivos encontrados, o que não é o que o OP pediu ...Ou execute o vim e de lá:
fonte
Além disso, se você deseja que eles sejam abertos um de cada vez, também é possível usar find -exec ou um loop for simples. Editado pelo comentário de ceving.
ou
fonte
-name
está ausente. E segundo: o comando falha miseravelmente assim que um nome de arquivo contém um espaço. -1 para resposta imprudente.Se você já digitou seu
find
comando, acho que pode ser muito mais fácil usarxargs
para abrir os resultados da pesquisa:A
-p
opção diz ao vim para abrir cada arquivo em uma nova guia. Acho isso mais conveniente do que apenas usar buffers, mas se você não o fizer, deixe essa opção.fonte
Para editar tudo
*.txt
, você pode simplesmente executar:vim *.txt
. Para editar arquivos retornados porfind
, leia mais.No Unix / macOS, você pode usar
find
com o BSDxargs
(consulte :)man xargs
, por exemploRelacionado: O terminal funcionou após a chamada do Vim com xargs no Vim.SE.
fonte