Como abro todos os arquivos resultantes de um comando ls?

10

Gostaria de abrir todos os arquivos de texto resultantes de um comando ls usando um editor de texto. Como eu faço isso?

c0smikdebris
fonte

Respostas:

12

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 filedirá 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 xargsou forna resposta do jmtd, dependendo de você estar usando um editor baseado em terminal que precise do stdio.

Caleb
fonte
4
Não analise a saída de ls! Uso editor-command *.css, etc.
Gilles 'SO- stop be evil'
@ Gilles: Observado, obrigado por apontar o óbvio que todos nós não podíamos ver. @ c0smikdebris Observe que eu reescrevi completamente minha resposta, incluindo um caso, se você não tiver uma maneira óbvia de combinar quais arquivos são texto apenas pelo nome.
Caleb
$ () é o que eu estava realmente procurando. Eu deveria ter mencionado que estou usando ls como exemplo aqui. +1 nas duas respostas.
C0smikdebris 5/05
"meu editor favorito". Não é necessário especificar, @Caleb, já que fica mais ou menos claro desde o início da resposta, ahahah! O melhor editor de todos os tempos!
Enrico Maria De Angelis
4

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 *.txtou o que quer. Use apenas *para combinar todos os arquivos no diretório atual.

Observe que o lscomando não está envolvido. O trabalho de lsnã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.

Gilles 'SO- parar de ser mau'
fonte
Isso é realmente específico do editor. Não há garantia de que todos os editores tratem todos os seus argumentos de linha de comando gratuitos como arquivos a serem abertos, nem suportam a abertura de mais de um arquivo por vez.
jmtd
2

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 findpara 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
jmtd
fonte
2
Não analise a saída de ls! Use $EDITOR *.cou for i in *.c; do $EDITOR "$i"; done.
Gilles 'SO- stop be evil'
Boa captura - editada adequadamente.
jmtd
Observe que o forcaso falhará em muitos nomes de arquivos, incluindo o recolhimento / alteração de caracteres de espaço em branco.
Jmtd
Como está escrito agora, o forcaso funcionará com todos os nomes de arquivos (exceto possivelmente nomes que começam com -ou +com alguns editores; isso for i in ./*.cseria corrigido).
Gilles 'SO- stop be evil'