Pergunta

Eu tenho um diretório como este:

dir
dir/somefile.txt
dir/subdir/subsub/somefile2.txt
dir/subdir2/somefile.txt

e eu quero abrir todos os arquivos em todos os subdiretórios em um único exemplo de um comando. Eu estava tentando encontrar com -exec, ou xargs, mas estes abrir cada arquivo com uma instância separada de um comando.

Basicamente, eu quero algo que acaba como kate dir/somefile.txt dir/subdir/subsub/somefile2.txt dir/subdir2/somefile.txt, mas para qualquer número de arquivos em qualquer número de subdiretórios. Estou usando bash, mas qualquer sugestão de script são muito bem.

esclarecimento: eu fiz não apenas arquivos .txt quer dizer, mas qualquer arquivo ascii (. Ie .php, .txt, .html, etc ..)

Foi útil?

Solução

Tente

kate `find . -name \*.txt -type f`

onde os -type f impede de bater diretórios.

Aqui está um exemplo usando ls -1 vez de kate:

edd@ron:~/src/debian/R$ ls -1 `find . -type f -name \*.txt`
./R-2.10.0/src/extra/graphapp/readme.txt
./R-2.10.0/src/extra/xdr/copyrght.txt
./R-2.10.0/src/extra/xdr/README.txt
./R-2.10.0/src/gnuwin32/fixed/etc/rgb.txt
./R-2.10.0/src/gnuwin32/installer/CustomMsg.txt
./R-2.10.0/src/library/grid/inst/doc/changes.txt
./R-2.10.0/src/unix/system.txt
./R-2.9.2-ra-1.2.8/src/extra/graphapp/readme.txt
./R-2.9.2-ra-1.2.8/src/extra/xdr/copyrght.txt
./R-2.9.2-ra-1.2.8/src/extra/xdr/README.txt
./R-2.9.2-ra-1.2.8/src/gnuwin32/fixed/etc/rgb.txt
./R-2.9.2-ra-1.2.8/src/gnuwin32/installer/CustomMsg.txt
./R-2.9.2-ra-1.2.8/src/library/grid/inst/doc/changes.txt
./R-2.9.2-ra-1.2.8/src/unix/system.txt
edd@ron:~/src/debian/R$

e se você realmente quer todos os arquivos em subdiretórios a chamada simplifica a

kate `find . -type f`

Se você está em dir/ ou então

kate `find dir -type f`

Outras dicas

Existem várias opções possíveis para isso. Estas respostas são baseadas em seu cenário onde você sabe que todos os arquivos podem ser abertos por Kate, e você quer abrir arquivos com qualquer extensão.

find dir -type f -exec kate {} +  

kate $(find dir -type f)

kate `find dir -type f`

A segunda e terceira formas são quase equivalentes. A principal diferença [1] é que a primeira versão vai lidar com arquivos com espaços em branco em seu nome, enquanto o segundo e terceiro não.

[1] Obrigado por apontar isto NVRAM, eu não percebi quando eu postei primeiro a resposta.

kate $(find dir -type f)

Você é ou não muito familiarizados com xargs, ou você não estiver usando-o corretamente, porque o que você está tentando fazer é exatamente o problema xargs é projetado para resolver: Dado um arbitrariamente longa lista de cordas, passá-las como argumentos para um programa em tão poucas execuções quanto possível sem exceder os limites do sistema sobre o número de argumentos de um programa pode tomar.

Você tem razão para find ... -exec, mas que também pode ser corrigido. Basta adicionar + no final do comando find e voila, ele se comporta como xargs.

Nenhuma das soluções acima que kate $(...) uso (ou o equivalente com acentos graves) trabalho em geral (que não suportam nomes de arquivos com espaços, não será executado em todos, se a lista de arquivos é muito longa). Ambos find ... + e xargs contornar essas limitações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top