Tamanho do arquivo legível por humanos com printf do find

4

Estou escrevendo uma função auxiliar simples para mostrar uma pasta específica no formato desejado:

find . -maxdepth 1 -not -name "." -printf '[%TY-%Tm-%Td]\t%s\t%f\n' | sort -n

No entanto, quero mostrar os arquivos em um formato mais agradável. Eu encontrei esta resposta que eu usado para criar uma função bash chamada hr .

user@host:~$ hr 12345
12M

Eu tentei usar isso na chamada find da seguinte forma:

find . -maxdepth 1 -not -name "." -printf '[%TY-%Tm-%Td]\t'$(hr %s)'\t%f\n' | sort -n

Mas ainda continua mostrando todo o tamanho do arquivo. Como devo modificar isso para que funcione como esperado?

    
por LeonardChallis 08.10.2015 / 10:38

4 respostas

3

Assumindo nomes de arquivos sensatos, com numfmt de gnu coreutils ( 8.21 ou posterior):

find . -type f -printf '[%TY-%Tm-%Td]\t%s\t%f\n' | numfmt --field=2 --to=iec-i

Você pode formatar ainda mais a saída por meio das opções --padding= e --format= (e com as versões mais recentes até definidas precisão de saída) por exemplo:

... |  numfmt --field=2 --to=iec-i --suffix=B --padding=8

ou

... |  numfmt --field=2 --to=iec-i  --format='%10.3f'

Se você não se importar com as permissões & colunas de contagem de links, com gnu ls :

ls -gohAt --time-style=+%Y-%m-%d
    
por 13.04.2017 / 14:36
2

Que tal -exec du após seu -printf ?

por exemplo:

jon@local$ find . -maxdepth 1 -not -iname "." -printf '[%TY-%Tm-%Td]\t' -exec du -bh {} \;
[2015-04-01]    1.6K    ./main.go
[2015-04-01]    5.2K    ./main_test.go
    
por 08.10.2015 / 15:42
1

Isso exigirá alguma adaptação se você quiser usá-lo, mas o utilitário dc incorpora um recurso pouco conhecido - se possivelmente muito útil - de manipulação de radices de saída arbitrária. Parece estranho no começo.

echo 1024o 1025p 1024p 1023p|dc
 0001 0001
 0001 0000
 1023

Mas não é muito difícil de entender.

ls -s  file;\
ls -hs file;\
echo 1024o 1048576p|dc
1048576 file
1.0G file
 0001 0000 0000

... e ...

dd bs=1kx1k seek=500 of=file <>/dev/null 2>&0;\
ls -s  file;\
ls -hs file;\
echo 1024o 512000p|dc
512000
500M
 0500 0000

Eu sou parcial para dc , mas bc pode fazer o mesmo tipo de coisa, não é tão direto quanto eu considero.

De qualquer forma, dc não irá ajudá-lo a manusear o seu script find ... -printf - o que eu acho que você terá que fazer um -exec para que funcione do jeito que você quer se você não o fizer t use numfmt como já foi sugerido. Mas se você fosse se adaptar a algo um pouco mais flexível e desenvolvido dessa forma, poderia ser muito útil para você. De qualquer forma, provavelmente é mais fácil fazer a maior parte do trabalho que sua função hr faz.

    
por 08.10.2015 / 15:08
1

Se a ordem dos campos não for importante

du --time --time-style=+[%F] -sh *

Em outro caso, você está livre para reordená-lo por sed , por exemplo

… | sed 's/\(\S*\s*\)\(\S*\s*\)//'
    
por 08.10.2015 / 16:03