Basicamente, estou procurando arquivos e, em seguida, classificando pelo tamanho. O script funciona se eu não classificar o tamanho por legível por humanos. Mas quero que o tamanho seja legível por humanos. Como posso classificar tamanhos legíveis por humanos?
Por exemplo:
ls -l | sort -k 5 -n | awk '{print $9 " " $5}'
Isso funciona como esperado, eu tenho o tamanho dos meus arquivos em bytes crescente:
1.txt 1
test.txt 3
bash.sh* 573
DocGeneration.txt 1131
andres_stuff.txt 1465
Branches.xlsx 15087
foo 23735
bar 60566
2016_stuff.pdf 996850
Agora, eu quero que o tamanho seja legível por humanos, então adicionei um parâmetro -h a ls e agora alguns arquivos estão fora de ordem:
ls -lh | sort -k 5 -n | awk '{print $9 " " $5}'
1.txt 1
DocGeneration.txt 1.2K
andres_stuff.txt 1.5K
test.txt 3
Branches.xlsx 15K
foo 24K
bar 60K
bash.sh* 573
2016_stuff.pdf 974K
-k 5
- como isso funciona?ls
saídadu
vez dels
pode ser uma boa ideia.find
's-printf
com a sua%p
e%s
formatadores (seguido por uma ‘humanização’ dos tamanhos).Respostas:
Experimentar
sort -h k2
Faz parte do tipo gnu, tipo BSD e outros.
fonte
ls
ser evitada?ls
e usar o globbing de arquivo diretamente. Globbing sozinho não vai funcionar aqui. Dito isto, eu provavelmente prefeririadu
isso.files=(); for f in *; do [[ -L "$f" ]] && files+=("$f"); done; echo ${#files[@]}
(Eu posso ter o interruptor de teste symlink errado). Se você não se importa com links simbólicos,,files=(*); echo ${#files[@]}
que se torna portátil se você usarset
e não matrizes.ls
possui essa funcionalidade, use a-S
opção e classifique na ordem inversa:ls -lShr
fonte
-h
não é uma opção padrãols
, mas deve ser utilizável se o OP já a possuir. O resto é padrão, e certamente é a resposta que eu teria escrito.ls
.-S
pode não estar disponível para o seuls
. O FWIW-S
é suportado mesmo com a biblioteca do Emacsls-lisp.el
, que é usada quando o sistema operacional não possuils
. Ele funciona no Emacs no MS Windows, por exemplo.-h
pode não estar disponível universalmente, mas a OP já está usando de qualquer maneira.-S
realmente deve estar disponível universalmente, porque está no link POSIX que Toby fornece. No entanto, existem muitos kits de ferramentas não POSIX por aí.Como nenhum shell específico foi mencionado, veja como fazer a coisa toda no
zsh
shell:O
**
padrão glob corresponde a nomes de caminho semelhantes,*
mas/
cruzados, ou seja, como uma pesquisa recursiva faria.O
ls
comando permitiria tamanhos legíveis por humanos com-h
, e formato de saída de lista longa com-l
. A-f
opção desativa a classificação, portantols
, basta listar os arquivos na ordem em que são fornecidos.Essa ordem é organizada pelo
**/*(.Lk-1024oL)
padrão de globbing do nome do arquivo, para que os arquivos menores sejam listados primeiro. O**/*
bit corresponde a todos os arquivos e diretórios neste diretório e abaixo, mas(...)
modifica o comportamento da glob (é um "qualificador da glob").É
oL
o final que ordena (o
) os nomes por tamanho de arquivo (L
, "comprimento").No
.
início, o glob corresponde apenas aos arquivos regulares (sem diretórios).O
Lk-1024
bit seleciona arquivos cujo tamanho é menor que 1024 KB ("comprimento em KB menor que 1024").Se
zsh
não for seu shell interativo principal, você poderá usarUse
setopt GLOB_DOTS
(ouzsh -o GLOB_DOTS -c ...
) para também corresponder nomes ocultos. ... ou apenas adicioneD
à cadeia qualificadora glob.Expandindo o exposto acima, supondo que você deseje uma saída de 2 colunas com nomes de caminho e tamanhos legíveis por humanos, e também assumindo que você possui os
numfmt
coreutils do GNU,ou, mais rápido,
fonte
Se o seu
sort
não tiver a-h
opção, você poderá usar um comando (ainda que muito longo) do awk como o seguinte:Isso classificará sua saída em bytes e depois a converterá em seu tamanho legível por humanos posteriormente.
fonte
Isso funcionaria?
A primeira
awk
exp procurará os arquivos com menos de 1 milhão e a segunda pegará o tamanho de byte do resultado e a converterá para o KB e imprimirá os 3 primeiros elementos para fornecer um tamanho legível por humanos.fonte