problema de cotação quando a tubulação encontra saída em xargs [duplicado]

0

Eu tenho um diretório com os seguintes subdiretórios, ou seja, se eu executar $ tree -L 1

.
├── 2007-06-20_to_2008-10-01
├── 2008-07-21_to_2008_08_12-Nokia 2mp
├── 2009-11-01_to_2011-01-10 - All iphone Pics
├── 2011-01-01 palliser-pics
├── 2011-03-10_to_2011-04-12-few iphone pics b4 switch to HTC
└── 2011-03-31-to-2013-05-01 ALL HTC pics-backup-prior-to-factory-reset

Gostaria de ver a quantidade de espaço em disco desses dois diretórios e todo o conteúdo deles.
por exemplo. saída desejada, algo como

2.7G  2007-06-20_to_2008-10-01
200MB 2008-07-21_to_2008_08_12-Nokia 2mp
1.3G  2009-11-01_to_2011-01-10 - All iphone Pics
667MB 2011-01-01 palliser-pics
2.3G  2011-03-10_to_2011-04-12-few iphone pics b4 switch to HTC
123MB 2011-03-31-to-2013-05-01 ALL HTC pics-backup-prior-to-factory-reset

Então eu tenho tentado:

find .  -maxdepth 1 -type d | xargs du -h 

mas como alguns dos nomes de diretório contêm espaços, cada linha da saída find está produzindo muitos WORD antes de ser passada para xargs , é possível corrigir isso?

Sei que a causa raiz do problema é causada pelos espaços nos arquivos, e usarei rename para corrigir se eu não conseguir encontrar uma maneira de obter o disksize com du , find e xargs

    
por the_velour_fog 15.11.2015 / 07:02

1 resposta

5

find | xargs deve ser sempre usado em conjunto com -print0 e -0 , conforme explicado em man find :

   -print0
          True; print the full file name on the standard output, followed
          by a null character (instead of the newline character that
          -print uses).  This allows file names that contain newlines or
          other types of white space to be correctly interpreted by
          programs that process the find output.  This option corresponds
          to the -0 option of xargs.

Assim você quer:
find . -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 du -sh
ou sem find e com um shell suficientemente evoluído ( zsh ):
print -N *(/) | xargs -0 du -sh
levando você ao que é ainda mais simples:
du -sh *(/)

    
por 15.11.2015 / 07:55