Como listar arquivos de n maiores diretórios?

5

Estou interessado em encontrar n maiores subdiretórios (por exemplo, 3) no meu diretório atual E ENTÃO listando todos os arquivos deles. Eu não estou interessado em encontrar arquivos maiores. Eu sei que há muitas soluções para encontrar arquivos maiores e não é isso que eu quero.

Encontrei meus 3 maiores subdiretórios com linha:

$ du -hs */ | sort -rh | head -3

com resultado:

212K    04/
52K     02/
20K     03/

mas de alguma forma não consigo listar arquivos desses diretórios (o encadeamento com ls não funcionou). Alguma sugestão de como fazer isso?

    
por bambosze_babuni 29.03.2017 / 15:00

2 respostas

7

Você pode usar os resultados de seus comandos canalizados com um loop while:

du -hs */ | sort -rh | head -3 | while read -r size dir 
do
   ls -l "$dir"
done

Como um forro:

du -hs */ | sort -rh | head -3 | while read -r size dir ; do ls -l "$dir"; done

Obrigado ao steeldriver por sugerir o uso de read em um loop while sobre um loop for usando awk , para manipular nomes de arquivos com espaços e caracteres especiais de maneira mais robusta.

    
por Arronical 29.03.2017 / 15:14
4

Substituição de comando, com ajuda de awk para obter os primeiros 3 diretórios:

ls -l $(du -hs */ | sort -rh | awk 'NR==4{exit} {print $2}')

Supondo que nenhum nome de diretório contenha espaços em branco ou qualquer caractere incomum.

Abordagem robusta: manipulando qualquer nome de arquivo (diretório) possível, gerando o nome do diretório como NUL separado em awk e recebendo ajuda de xargs para lidar com cada diretório:

du -0hs */ | sort -zrh | awk 'BEGIN{RS="
du -0hs */ | sort -zrh | awk 'BEGIN{RS="
ls -l $(du -hs */ | sort -rh | awk 'NR==4{exit} {print $2}')
"} NR==4{exit} {printf("%s
du -0hs */ | sort -zrh | awk 'BEGIN{RS="
du -0hs */ | sort -zrh | awk 'BEGIN{RS="%pre%"} NR==4{exit} {printf("%s%pre%", $2)}' | \
    xargs -0 -I{} ls -l {}
"} NR==4{exit} {printf("%s%pre%", $2)}' | \ xargs -0 ls -l
", $2)}' | \ xargs -0 -I{} ls -l {}
"} NR==4{exit} {printf("%s%pre%", $2)}' | \ xargs -0 ls -l

Cada conteúdo do diretório por vez:

%pre%     
por heemayl 29.03.2017 / 15:33