Estou procurando listar todo o conteúdo de um diretório, incluindo o conteúdo das subpastas, mas classificado por tamanho de arquivo. Até agora, consegui listar e classificar, embora ainda seja recursivo ls -lhSR
( h
é bom ter, mas definitivamente não é essencial para mim, desde que eu consiga obter tamanhos de arquivo). Provavelmente estou ignorando algo óbvio ou perguntando o impossível, mas qualquer conselho aqui seria muito apreciado.
Responder1
Você pode usar encontrar:
find . -type f -printf "%s %P\n" | sort -n
Opcional: para converter valores de bytes em formato legível por humanos, adicione isto:
| numfmt --to=iec-i --field=1
Explicação:
find in current directory (.) all files (-type f)
-printf: suppress normal output and print the following:
%s - size in bytes
%P - path to file
\n - new line
| sort -n: sort the result (-n = numeric)
Responder2
Como você não especificou um shell específico, aqui está uma alternativa usando os qualificadores glob do zsh com
setopt extendedglob
para a recursão. Então, por exemplo:
liste recursivamente arquivos simples:
printf '%s\n' **/*(.)
listar recursivamente arquivos simples,óordenado poremvincandoeuength (ou seja, tamanho):
printf '%s\n' **/*(.oL)
listar recursivamente arquivos simples,Óordenado pordetamanho do vinco:
printf '%s\n' **/*(.OL)
liste recursivamente os arquivos simples, ordenados por tamanho decrescente, e selecione os 3 principais resultados:
printf '%s\n' **/*(.OL[1,3])
Se você quiser os tamanhos dos arquivos também, poderá usar
du -hb **/*(.OL[1,3])
Responder3
Com a globstar
opção shell definida, você pode usar o shell globbing:
shopt -s globstar # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n
Se você tentar fazer isso com muitos arquivos, receberá um erro “Lista de argumentos muito longa”. Para contornar isso, você pode usar printf
e xargs
:
printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n
Acabei de perceber que isso também imprime os diretórios (com tamanho de 4096 bytes) - se você não quiser isso, use isto:
stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n
Exemplo de execução
$ tree
.
├── edits.png
├── makescript
├── new
│ └── edits.png
└── test
└── 1.png
2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
Responder4
Para uso interativo rápidoem árvores de diretórios que não são muito grandes,shopt -s globstar
É realmente bom. Um glob não pode filtrar diretórios com base no tipo, mas se você usá-lo, ls -d
apenas ls
imprimirá o nome do diretório, em vez do conteúdo.
Supondo que seu ll
alias inclua -lh
:
# with shopt -s globstar in your .bashrc
ll -rSd **/*
fornecerá uma saída como esta (do meu diretório code-golf), mas com destaque de cores (para que seja mais fácil ver os diretórios). Observe que a classificação por tamanho de arquivo ocorreu em subdiretórios.
drwxr-xr-x 1 peter peter 70 Jun 8 07:56 casexchg
...
drwxr-xr-x 1 peter peter 342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter 387 Jul 29 2017 likely.cpp
-rw-r--r-- 1 peter peter 416 Aug 31 2017 true-binary.asm~
-rw-r--r-- 1 peter peter 447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun 1 2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31 2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17 2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24 2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25 2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25 2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25 2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26 2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb 6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25 2017 fibonacci/fibonacci-1G-performance.asm~
...
Você pode filtrar os diretórios percorrendogrep -v '^d'
Às vezes, você pode usar um glob que corresponda apenas a arquivos e não a diretórios, se seus nomes de arquivos tiverem um padrão. por exemplo ll -rSd **/*.jpg
, ou até mesmo **/*.*
funciona se nenhum dos seus nomes de diretório tiver .
neles e todos os arquivos que você desejafazer.
(Para pessoas com experiência em DOS: não há nada de mágico *.*
no Unix. Ele 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 fornecer extensões aos nomes de arquivos.)
@dessert indica que você precisaria shopt -s dotglob
combinartodosarquivos.
Com GNUfind
Se não houver muitos arquivos para caber em uma ls
linha de comando, find -exec ls {} +
colocarei todos eles na linha de comando, onde ls
poderá classificá-los.
find -not -type d -exec ls --color -lrSh {} +
Usar -not -type d
em vez de -type f
evita ignorar links simbólicos, pipes nomeados, soquetes, arquivos de dispositivos e qualquer outra coisa que você tenha em seus diretórios.
Com du
:
du -ach | sort -h
....
4.0K x86-modedetect-polyglot.o
8.0K ascii-compress-base.asm
8.0K dizzy-integer
8.0K stopwatch-rdtsc.asm
8.0K string-exponential.asm
8.0K true-binary
12K a.out
12K bubblesort.asm
12K casexchg
12K empty-args
100K parity-party
220K fibonacci
628K total
Agora os nomes dos diretórios são classificados na lista para somar todo o seu conteúdo, mas os arquivos individuais ainda são incluídos.
sort -h
, também conhecido como --human-numeric-sort
, classifica números com sufixos de tamanho, como du -h
impressões. É perfeito para usar com du
.
Costumo usar du -sch * | sort -h
, ou */
para obter apenas diretórios.
du -sch **/* | sort -h
lhe daria a saída acima, se você esquecer que du
tem uma -a
opção.
(Só reservei um tempo para pesquisar porque estou postando uma resposta. Para uso interativo, provavelmente teria usado apenas du -sch **/*
.