Estou procurando listar todo o conteúdo de um diretório, incluindo o conteúdo de subpastas, mas classificado por tamanho de arquivo. Até agora, eu consegui chegar até a listagem e a classificação enquanto ainda estava sendo recursivo ls -lhSR
( h
é bom ter isso, mas definitivamente não é essencial para mim, desde que eu possa obter tamanhos de arquivo). Provavelmente estou ignorando algo óbvio ou pedindo o impossível, mas qualquer conselho aqui seria muito apreciado.
9
Como você não especificou um shell específico, eis uma alternativa usando os qualificadores glob do zsh com
para a recursão. Então, por exemplo:
liste recursivamente os arquivos simples:
listar recursivamente arquivos deslizantes, o rdered por em vincando L ength (ou seja, tamanho):
recursivamente lista arquivos deslizantes, O rdered por de tamanho vincar:
liste recursivamente os arquivos simples, ordenados por tamanho decrescente, e selecione os 3 principais resultados:
Se você quiser os tamanhos de arquivo também, poderá usar
fonte
Com a
globstar
opção de shell definida, você pode usar o globbing do shell:Se você tentar isso com muitos arquivos, receberá um erro "Lista de argumentos muito longa". Para contornar isso, você pode usar
printf
exargs
:Acabei de perceber que isso imprime os diretórios (com um tamanho de 4096 bytes) também - se você não quiser, use isso:
Exemplo de execução
fonte
dotglob
opção de shell, veja minha resposta atualizada.printf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
ls -lhSd **/*
se não se importar de ter os diretórios como parte da lista. Ou se nenhum dos seus nomes de diretório têm.
neles, e todos os arquivos que você quer fazer , você podell -hS **/*.*
, ou similar.Se você não possui zsh, ainda pode usar
du
+sort
:Tamanhos legíveis por humanos, incluindo tamanhos cumulativos de diretórios:
Somente arquivos (usando
find
):Em ambos os casos, eu optaram por utilizar linhas de terminação nula (
-0
,-z
,-print0
opções), para ser seguro contra todos os nomes de arquivos válidos.fonte
Para um uso interativo rápido em árvores de diretório que não são muito grandes,
shopt -s globstar
é muito bom. Um glob não pode filtrar os diretórios com base no tipo, mas se você usá-lols -d
,ls
apenas imprimirá o nome do diretório, em vez do conteúdo.Supondo que seu
ll
alias inclua-lh
:fornecerá uma saída assim (do meu diretório code-golf), mas com realce de cores (para que seja mais fácil ver os diretórios). Observe que a classificação por tamanho do arquivo ocorreu entre subdiretórios.
Você pode filtrar os diretórios através de
grep -v '^d'
Às vezes, você pode usar um globo que corresponda apenas a arquivos e não a diretórios, se os nomes de arquivos tiverem um padrão. por exemplo
ll -rSd **/*.jpg
, ou até**/*.*
funciona se nenhum dos nomes de diretório tiver.
neles e todos os arquivos que você deseja fazer .(Para pessoas com experiência em DOS: não há nada mágico
*.*
no Unix. Apenas corresponde a qualquer entrada de diretório que contenha um ponto literal. Mas, além de executáveis e, às vezes, arquivos de texto, é comum dar extensões aos nomes de arquivos.)O @dessert aponta que você precisaria
shopt -s dotglob
para corresponder a todos os arquivos.Com GNU
find
Se não houver muitos arquivos para caber em uma
ls
linha de comando,find -exec ls {} +
todos eles serão colocados na linha de comando, ondels
podem ser classificados.Usar em
-not -type d
vez de-type f
evitar ignorar links simbólicos, pipes nomeados, soquetes, arquivos de dispositivos e tudo o mais que você tiver em seus diretórios.Com
du
:Agora, os nomes dos diretórios são classificados na lista para somar o total de todo o seu conteúdo, mas os arquivos individuais ainda estão incluídos.
sort -h
, também conhecido como--human-numeric-sort
, classifica números com sufixos de tamanho, comodu -h
impressões. É perfeito para uso comdu
.Costumo usar
du -sch * | sort -h
ou*/
obter apenas diretórios.du -sch **/* | sort -h
daria a você a saída acima, se você esquecer quedu
tem uma-a
opção.(Levei apenas um tempo para procurá-lo porque estou postando uma resposta. Para uso interativo, provavelmente eu teria usado
du -sch **/*
.fonte