Gostaria de abrir todos os arquivos de texto resultantes de um comando ls usando um editor de texto. Como eu faço isso?
Gostaria de abrir todos os arquivos de texto resultantes de um comando ls usando um editor de texto. Como eu faço isso?
Respostas:
Gilles está exatamente certo , ls
é um péssimo exemplo, porque a expansão glob do nome do arquivo pode ser muito mais fácil na linha de comando sem a necessidade de usar ls
! Se os chamados "arquivos de texto" tiverem extensões de nome de arquivo para identificá-los, você poderá fazer algo assim:
editor-command *.txt
Para demonstrar uma técnica, vamos usar um exemplo mais complicado que não poderia ser feito apenas com uma correspondência de nome de arquivo e abrir arquivos com base no conteúdo em vez de apenas no nome do arquivo. Digamos que você queira abrir todos os arquivos que contenham a sequência "tipo de conteúdo".
Supondo que seu editor aceite vários nomes de arquivos e os abra todos de uma vez em buffers separados ou trabalhe sequencialmente em seu caminho, você pode simplesmente executar:
editor-command $(grep -i content-type)
Agora, voltando à sua pergunta original, digamos que você não saiba se eles são arquivos de texto ou se não são baseados em seus nomes. Você precisaria então usar outro programa para identificá-los e abri-los com base nesses dados. O programa file
dirá a você que tipo de arquivo é algo e você poderá preencher essa lista apenas com arquivos de texto e, em seguida, abrir apenas os nomes de arquivos correspondentes assim:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
A saída da cadeia de comandos dentro da $()
construção será usada como argumento para o editor. Às vezes faço isso em duas etapas. Digamos que eu esteja pesquisando algum conjunto de arquivos e consiga uma lista de todos os arquivos xml que contêm a string "content-type"
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... e decida que quero abri-los. Eu então uso o último atalho do histórico de comandos e faço isso:
vim $(!!)
... para abrir todos os resultados do comando anterior no vim, meu editor favorito.
Se o seu editor aceitar apenas um arquivo de cada vez e você precisar continuar gerando editores, será necessário usar uma variante do loop xargs
ou for
na resposta do jmtd, dependendo de você estar usando um editor baseado em terminal que precise do stdio.
Para abrir todos os arquivos chamados algo .txt
(ou seja *.txt
) no diretório atual:
$EDITOR *.txt
onde $EDITOR
é o seu editor favorito, por exemplo gedit *.txt
, nano *.txt
, vim *.txt
, emacs *.txt
ou o que quer. Use apenas *
para combinar todos os arquivos no diretório atual.
Observe que o ls
comando não está envolvido. O trabalho de ls
não é realmente exibir uma lista de arquivos, embora isso aconteça quando você o invoca em um diretório. Onde ls
é útil é exibir os atributos do arquivo (hora da modificação, permissões, tamanho e assim por diante). Para fazer algo em um monte de arquivos que correspondem a um determinado padrão curinga, os globs do shell são suficientes.
Editores avançados o suficiente permitem fazer isso de dentro. Por exemplo, no Emacs, use o comando de abertura de arquivo normal ( C-x C-f
) e digite *.txt
.
Se você também deseja corresponder arquivos em subdiretórios, em zsh ou bash ≥4, pode usar $EDITOR **/*.txt
.
Depende de algumas nuances do seu editor de texto. Os editores avançados provavelmente podem lidar com a abertura de vários arquivos na linha de comando em uma instância. Mas digamos, por exemplo, que seu editor ($ EDITOR nos meus exemplos abaixo) pode abrir apenas um de cada vez. Você deve canalizar a saída de um apropriado find
para xargs
. Isso também depende do fato de o $ EDITOR não assumir o TTY (portanto, usando um gráfico)
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
Se você deseja usar um editor de console, um loop de shell pode ser mais apropriado, mas falhará em muitos nomes de arquivos incomuns (recolhendo ou substituindo caracteres de espaço em branco e várias outras coisas):
for i in *.c; do $EDITOR "$i"; done
for
caso falhará em muitos nomes de arquivos, incluindo o recolhimento / alteração de caracteres de espaço em branco.
for
caso funcionará com todos os nomes de arquivos (exceto possivelmente nomes que começam com -
ou +
com alguns editores; isso for i in ./*.c
seria corrigido).
editor-command *.css
, etc.