recursivo 'ls' dando nomes absolutos de arquivos

4

Quando eu faço 'ls -R' em um diretório, eu recebo algo como

./dir1
dir2 file1.txt file2.txt

./dir1/dir2
file3.txt file4.txt

mas gostaria de um comando que me dê

./dir1/file1.txt
./dir1/file2.txt
./dir1/dir2/file3.txt
./dir1/dir2/file4.txt

tal que eu posso usá-lo em um loop para processar todos os arquivos.

    
por thias 30.09.2011 / 13:14

3 respostas

9

Você quer find(1) . Isso fará exatamente o que você deseja. Você também pode especificar várias condições de filtro, como o tipo de arquivo (não incluir diretórios), mais novo que o registro de data e hora em um determinado arquivo, etc. A página man descreverá isso com mais detalhes.

Além disso, dê uma olhada na opção -exec ; você pode usar isso em vez de iterar pela saída.

    
por 30.09.2011 / 13:24
4

Se você estiver usando o bash ≥4 ou zsh ou ksh93 ≥o + 1 , você pode fazer o shell fazer globalização recursiva: o curinga **/ corresponde aos diretórios em qualquer profundidade. No bash, você precisa habilitar o recurso com shopt -s globstar (bash), e cuidado que até bash 4.2, **/ atravessa links simbólicos para diretórios. Em ksh93, você precisa de set -o globstar (ksh93); em zsh, está sempre ativado.

for x in **/*.txt; do …

Se você precisar que seu script seja portável para outros shells, use O comando find é exatamente a ferramenta certa para o trabalho. Observe que find é um comando externo que pode funcionar de duas maneiras: pode gerar uma lista de arquivos e executar comandos para cada arquivo. Se você quiser executar um comando para cada arquivo, use -exec :

find . -type f -name '*.txt' -exec chmod a+r {} +

1 Entre os shells não-Bourne, fish e tcsh também têm o recurso

    
por 01.10.2011 / 01:26
0

tree também é uma boa ferramenta para isso.

eu uso

tree -Dpushfag --du

você também pode adicionar um limite em profundidade, por exemplo, no máximo dois níveis:

tree -Dpushfag --du -L 2
    
por 04.02.2015 / 11:10