Bash Script - Como posso obter o tamanho dos diretórios no arquivo .txt e salvá-los em outro arquivo?

3

Comecei algumas semanas com a programação bash do Linux, mas estou lidando com um problema: Como posso obter o tamanho de vários diretórios (caminho salvo em um arquivo .txt) e, em seguida, gravar em outro arquivo, o diretório caminho, seguido do tamanho e do tamanho total ocupado por esses diretórios. Eu já tentei isso, mas não tenho certeza:

totsize=0
while read -r diretory; do
   size=$(du -ch "$directory")
   echo "$diretory size: $size" > "$homedir/$filename2"
   $totsize += $(du -c "$homedir/$diretorio")
done < "$homedir/diretories.txt"
sudo echo "total size: $totsize" >> "$homedir/$filename2"

Agradecemos antecipadamente (e desculpe pelo mau inglês)

    
por user5445222 14.10.2015 / 15:49

3 respostas

1

Use find combinado com du e redirecione para o arquivo com >

sudo find /path/to/topDir -maxdepth 1 -type d  -exec du -sh {} \;  > output.txt

Exemplo:

xieerqi:$ sudo find Desktop -maxdepth 1 -type d  -exec du -sh {} \; > outputFile1.txt                                                            
[sudo] password for xieerqi: 

xieerqi:$ cat outputFile1.txt                                                                                                                    
2.7G    Desktop
69M Desktop/linux-kernel-4.1.0
1.1M    Desktop/DOCS
6.8M    Desktop/The comments that became a reporter’s death sentence | New York Post_files
4.0K    Desktop/newdir
6.7M    Desktop/IMAGES
12M Desktop/TIRES
504K    Desktop/MSU-TEMPLATES
341M    Desktop/PDFS
19M Desktop/java

Para que este comando forneça o uso do disco para diretórios específicos da lista, o que você pode fazer é combinar cat e xargs com o comando acima. Por exemplo,

 cat dirList.txt | xargs -I dir sudo find dir -maxdepth 0 -type d  -exec du -sh {} \; 

Alguns diretórios dos quais você não é proprietário exigem que sudo access liste seu uso de disco, portanto combine isso com sudo sh -c . Deixe-me demonstrar,

xieerqi:$ sudo sh -c "cat dirList.txt | xargs -I dir find dir -maxdepth 0 -type d  -exec du -sh {} \+"                                           
[sudo] password for xieerqi: 
2.7G    /home/xieerqi/Desktop
11M /bin
5.5G    /usr

xieerqi:$ cat dirList.txt                                                                                                                        
/home/xieerqi/Desktop
/bin
/usr
    
por Sergiy Kolodyazhnyy 14.10.2015 / 20:06
3

Ao lidar com arquivos ou diretórios pelo seu nome, é altamente recomendável lidar com eles separados pelo caractere nullbyte, não por uma nova linha. Porque oficialmente um nome de arquivo pode conter uma nova linha. Então você não deve fazer uma lista dos diretórios separados por uma nova linha.

De qualquer forma, quando você tem essa lista, você pode usar isso:

du -sch --files0-from=dirs.txt
  • -s é como -d0 e só resumirá um total para cada argumento.
  • -c calcula um total geral.
  • -h faz isso tudo em formato legível por humanos.
  • --files0-from=dirs.txt lê os nomes de arquivos / directorynames do arquivo dado terminado por nullbyte.

Com sua lista, ela deve parecer (mas com a armadilha de nomes de arquivos com novas linhas):

tr '\n' '
du -sch --files0-from=dirs.txt
' <dirs.txt | du -sch --files0-from=-
    
por chaos 14.10.2015 / 16:37
1

Você pode obter o tamanho dos diretórios com o comando du da seguinte forma:

du -h -d 1 "path to parent directory"

-d: a profundidade dos subdiretórios

    
por Ghasem Pahlavan 14.10.2015 / 16:07