Como eu abro todos os arquivos que são o resultado de um comando ls?

11

Gostaria de abrir todos os arquivos de texto que são o resultado de um comando ls usando um editor de texto. Como faço isso?

    
por c0smikdebris 04.05.2011 / 16:51

3 respostas

12

Gilles está exatamente certo , ls é um péssimo exemplo porque a expansão glob do nome do arquivo pode ser feita muito mais facilmente na linha de comando sem ter que usar ls ! Se seus 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 arquivos abertos com base no conteúdo, em vez de apenas no nome do arquivo. Vamos dizer que você queria abrir todos os arquivos que continham a string "content-type".

Assumindo que o seu editor aceitará vários nomes de arquivos e os abrirá de uma só vez em buffers separados ou funcionará sequencialmente através deles, você pode simplesmente executar:

editor-command $(grep -i content-type)

Agora, voltando à sua pergunta original, digamos que você não saiba se são arquivos de texto ou não baseados em seus nomes. Você precisaria 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ê pode usar essa lista apenas para arquivos de texto e, em seguida, abrir apenas os nomes de arquivos correspondentes como este:

editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)

A saída da cadeia de comandos dentro da construção $() será usada como argumentos para o editor. Eu às vezes faço isso em dois estágios. Digamos que eu esteja procurando em alguns arquivos e obtenha uma lista de todos os arquivos xml contendo a string "content-type"

find -type f -iname '*xml' | xargs grep -Hi 'content-type' |  cut -d: -f1

... e decido que eu 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 por vez e você precisar continuar gerando editores, será necessário usar uma variante do loop xargs ou for em resposta do jmtd dependendo se você está usando um editor baseado em terminal que precisa de stdio.

    
por 04.05.2011 / 22:20
5

Para abrir todos os arquivos chamados algo .txt (ou seja, *.txt ) no diretório atual:

$EDITOR *.txt

onde $EDITOR é seu editor favorito, por exemplo gedit *.txt , nano *.txt , vim *.txt , emacs *.txt ou o que for. Use apenas * para corresponder a todos os arquivos no diretório atual.

Observe que o comando ls não está envolvido. A tarefa de ls não é realmente exibir uma lista de arquivos, embora isso aconteça quando você a chama em um diretório. Onde ls é útil na exibição de atributos de arquivo (horário de modificação, permissões, tamanho e assim por diante). Para fazer algo em um monte de arquivos que correspondam a um determinado padrão curinga, as globs do shell são suficientes.

Editores avançados o suficiente permitem que você faça isso por dentro. Por exemplo, no Emacs, basta usar o comando normal de abertura de arquivo ( C-x C-f ) e inserir *.txt .

Se você também deseja corresponder arquivos em subdiretórios, em zsh ou bash ≥4, você pode usar $EDITOR **/*.txt .

    
por 04.05.2011 / 22:22
3

Depende de algumas nuances do seu editor de texto. Os editores avançados provavelmente podem manipular a abertura de vários arquivos a partir da linha de comando em uma instância. Mas diga, por exemplo, que seu editor ($ EDITOR em meus exemplos abaixo) só pode abrir um de cada vez. Você deve enviar a saída de um find apropriado para xargs . Isso também depende do $ EDITOR não assumir o TTY (então, usando um gráfico)

find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR

Se você quiser usar um editor de console, um loop de shell pode ser mais apropriado, mas se falhará por muitos nomes de arquivos incomuns (colapsando ou substituindo caracteres de espaço em branco e várias outras coisas):

for i in *.c; do $EDITOR "$i"; done
    
por 04.05.2011 / 16:56