Como trabalho recursivamente através de uma árvore de diretórios e executo um comando específico em cada arquivo, e envia o caminho, nome do arquivo, extensão, tamanho do arquivo e algum outro texto específico para um único arquivo no bash.
14
Respostas:
Embora as
find
soluções sejam simples e poderosas, decidi criar uma solução mais complicada, baseada nessa interessante função que vi alguns dias atrás.1. Crie um arquivo de script executável, chamado
walk
, localizado/usr/local/bin
para ser acessível como comando shell:nano
: Shift+ Insertpara colar; Ctrl+ Oe Enterpara salvar; Ctrl+ Xpara sair.2. O conteúdo do script
walk
é:3. Explicação:
O principal mecanismo da
walk()
função é muito bem descrito por Zanna em sua resposta . Então, vou descrever apenas a nova parte.Dentro da
walk()
função eu adicionei este loop:Isso significa que para cada
$entry
arquivo que será executado, a função será executadafile_specification()
.A função
file_specification()
tem duas partes. A primeira parte obtém dados relacionados ao arquivo - nome, caminho, tamanho etc. A segunda parte gera os dados em uma forma bem formatada. Para formatar os dados é usado o comandoprintf
. E se você deseja ajustar o script, leia sobre este comando - por exemplo, este artigo .A função
file_specification()
é um bom local para colocar o comando específico que deve ser executado para cada arquivo . Use este formato:Ou você pode salvar a saída do comando como variável e, em seguida,
printf
esta variável, etc .:Ou diretamente
printf
a saída do comando:A seção ao pedido, chamada
Colourise the output
, inicializa algumas variáveis que são usadas noprintf
comando para colorir a saída. Mais sobre isso você pode encontrar aqui .Na parte inferior do script, é adicionada uma condição adicional que lida com caminhos absolutos e relativos.
4. Exemplos de uso:
Para executar
walk
no diretório atual:Para executar
walk
em qualquer diretório filho:Para executar
walk
em qualquer outro diretório:Para criar um arquivo de texto, com base na
walk
saída:Para criar um arquivo de saída sem códigos de cores ( origem ):
5. Demonstração de uso:
fonte
Estou um pouco perplexo com o motivo de ninguém ter postado ainda, mas, de fato
bash
, possui recursos recursivos, se você ativar aglobstar
opção e usar o**
glob. Como tal, você pode escrever (quase) umbash
script puro que usa a globstar recursiva como esta:Observe que aqui usamos a expansão de parâmetros para obter as partes do nome do arquivo que queremos e não confiamos em comandos externos, exceto para obter o tamanho do arquivo
du
e limpar a saída comawk
.E como ele atravessa sua árvore de diretórios, sua saída deve algo como isto:
Aplicam-se regras padrão de uso de script: verifique se ele é executável
chmod +x ./myscript.sh
e execute-o no diretório atual via./myscript.sh
ou coloque-o~/bin
e execute-osource ~/.profile
.fonte
"$(file "$i")"
(no script acima como segunda parte de um printf) retornariam?output the path, filename, extension, filesize
, portanto a resposta corresponde ao que é solicitado. :)Você pode usar
find
para fazer o trabalhoIsso o ajudará se você quiser apenas listar todos os arquivos com tamanho.
-exec
permitirá que você execute comandos ou scripts personalizados para cada arquivo\;
usado para analisar arquivos um por um, você pode usar+;
se quiser concatená-los (significa nomes de arquivos).fonte
Com
find
apenas.Ou então, você pode usar abaixo:
fonte
find -printf
). 1Se você souber a profundidade da árvore, a maneira mais fácil será usar o curinga
*
.Escreva tudo o que você deseja fazer como um shell script ou uma função
em seguida, executar
for i in *; do thing "$i"; done
,for i in */*; do thing "$i"; done
... etcDentro da sua função / script, você pode usar alguns testes simples para destacar os arquivos com os quais deseja trabalhar e fazer o que for necessário com eles.
fonte
$i
.for i in */*
funciona. Aqui, teste-o:for i in */*; do printf "|%s|\n" "$i"; done
find
posso fazer isso:Dê uma olhada em
man find
outras propriedades do arquivo.Se você realmente precisa da extensão, pode adicionar este:
fonte