Total de tamanho de arquivos em particular em um diretório

-1

Como calculamos o tamanho total de alguns arquivos mencionados em um diretório.

Explicação: Eu tenho um total de 5000 arquivos em um diretório. Eu preciso descobrir apenas o tamanho total de cerca de 1000 arquivos.

Na verdade, esses 1000 arquivos devem ser excluídos, mas antes de serem excluídos, é necessário calcular o tamanho total desses arquivos.

Eu tenho nomes e caminho desses arquivos em um arquivo de texto. Esses arquivos estão em formato pdf, flv, pptx etc. como:

/digi_en-gb/var/www/html/content/Collaborative_Games/multiplication/SB/08_Multip‌​lication Maze SB_Done.doc 
/digi_en-gb/var/www/html/content/Project_Ideas/178401/178401_chart_food_secu.pdf 
/digi_en-gb/var/www/html/content/LessonPlan_Master/100079/AC1030T.pptx

Algum pode me ajudar com um script ou comando para conseguir isso.

    
por Rshrth 30.01.2015 / 08:38

5 respostas

2

Se você tivesse uma lista de arquivos NUL terminada , você poderia usar a opção --files0-from= de du . De man du :

   --files0-from=F
          summarize disk usage of the NUL-terminated file names  specified
          in file F; If F is - then read names from standard input

Você pode converter uma lista separada por nova linha em uma lista separada por NUL usando tr , por exemplo,

tr '\n' '
du -sch --files0-from=filelist0
' < filelist > filelist0

Então

du -sch --files0-from=filelist0 | tail -n 1

Se você quiser ver apenas o total, envie o resultado por meio de tail

tr '\n' '
   --files0-from=F
          summarize disk usage of the NUL-terminated file names  specified
          in file F; If F is - then read names from standard input
' < filelist | du -sch --files0-from=- | tail -n 1

Para evitar gerar o arquivo extra, você pode fazer algo assim

tr '\n' '
du -sch --files0-from=filelist0
' < filelist > filelist0
    
por steeldriver 30.01.2015 / 14:40
1

Supondo que você salvou os arquivos como o seguinte formato em list file:

/path/to/filename0.pdf
/path/to/filename1.pdf
/path/to/filename0.flv
/path/to/filename0.pptx
...

E tente abaixo o comando que chama o comando du -h shell de awk para cada linha ( $0 ) do arquivo list :

awk '/.*pdf|.*flv$/{ system("du -h \"" $0 "\"") }' /path/to/list
13.2M   /path/to/filename0.pdf
5.3M    /path/to/filename1.pdf
50.18M  /path/to/filename0.flv

Como você pode ver, isso mostrará o tamanho de cada arquivo .pdf e .flv em cada linha.

Agora, se você quiser calcular a soma de todos os tamanhos de arquivo, use awk da seguinte forma:

awk '/.*pdf|.*flv$/{ system("du -h \"" $0 "\"") }' /path/to/list | awk '{ SUM += $1} END{ print "Total "SUM" MB" }'
Total 68.68 MB

Além disso, você pode usar o comando rm em awk como o comando du para solicitar ao arquivo correspondente incluindo seu tamanho à esquerda e pressionar Y/N para excluir o arquivo selecionado Arquivo. veja em etapas:

$ ls path/to/
filename0.flv  filename0.pdf  filename1.pdf  filename.pptx  list

$ awk '/.*pdf$|.*flv$/{ system("du -h \"" $0 "\"" ";rm -i \"" $0 "\"")}' path/to/list
13.2M   /home/user/path/to/filename0.pdf
rm: remove regular file ‘/home/user/path/to/filename0.pdf’? y
5.3M    /home/user/path/to/filename1.pdf
rm: remove regular file ‘/home/user/path/to/filename1.pdf’? y
50.18M  /home/user/path/to/filename0.flv
rm: remove regular file ‘/home/user/path/to/filename0.flv’? y

$ ls path/to/
filename.pptx  list
    
por devWeek 30.01.2015 / 11:47
1

Eu não pude testá-lo bastante ainda, já que não estou em casa agora, mas um pequeno teste me faz acreditar que o roteiro abaixo deve funcionar.

É uma versão editada do este .

Como usar

  • Copie o script abaixo em um arquivo vazio, salve-o como calculate_size.py .
  • abra uma janela de terminal, digite o seguinte comando:

    python3 /path/to/calculate_size.py </path/to/your/textfile/with/a/filelist>
    
  • Nota se você precisar de sudo privileges nos diretórios onde os arquivos armazenam arte, execute o script com sudo :

     sudo python3 /path/to/calculate_size.py </path/to/your/textfile/with/a/filelist>
    

Ele mostra uma saída como:

Asualistadeveterumcaminhoparaumarquivoporlinha,semlinhasembranco(casocontrário,elecausariaumerro).

Oscript

#!/usr/bin/env python3 import os import subprocess import sys f_list = sys.argv[1] get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8") with open(f_list) as src: files = [f.strip() for f in src.readlines()] total_size = [] for f in files: size = get('du -hk "'+f+'"').split()[0]; total_size.append(int(size)) print(f.strip('"')+"\t", size+" k") print("-"*30, "\nnumber of files: "+str(len(total_size)), "\ntotal size: "+str(sum(total_size))+" k") try: print("average size: "+str(int(sum(total_size)/len(total_size)))+" k\n\n") except ZeroDivisionError: pass proceed = input("Should I delete the listed files? \n(press return to proceed, x + return to cancel): ") if proceed == "": for file in files: os.remove(file)     
por Jacob Vlijm 30.01.2015 / 10:36
0

Que tal find e du em um terminal (bash ok)?

Por exemplo, para encontrar todos os arquivos .pdf, e a exibição pode usar:

find /folder/path -iname *.pdf -type f -print0 | xargs -0 du -c --block-size=human-readable

Ou use o padrão que você quiser no lugar de *.pdf

Ou para tamanhos de byte único, use a du option --block-size=1

O exemplo acima mostra o espaço em disco usado pelos arquivos, para mostrar o "tamanho aparente" (que ls normalmente mostra) use o du option --apparent-size

Ou, mostre apenas o total geral ( du -s ) e combine algumas opções para mostrar o tamanho aparente do arquivo em 1 bytes:

find /folder/path -iname *.pdf -type f -print0 | xargs -0 du -bs

Deseja cortar o caminho info & mostra apenas os bytes? Adicione | cut -f 1

Veja as páginas man ou info para find , xargs e du para mais informações.

Depois que a pergunta foi editada para adicionar os arquivos em um arquivo de texto, ainda é possível usar xargs junto com a opção:

--arg-file=file
-a file
          Read items from file instead of standard input.  If you use this
          option, stdin remains unchanged when commands are  run.   Other‐
          wise, stdin is redirected from /dev/null.

Então:

xargs --arg-file=file du -bs
    
por Xen2050 30.01.2015 / 09:49
0

Como você tem uma lista específica de arquivos a serem excluídos e não há restrições na modelagem da solução, é bastante simples (bash):

#!/bin/bash

if [ $# -ne 1 ];
then
    echo "Usage $0 filename";
    exit 1;
fi

totalsize=0;

while read filename
do
    filesize='du $filename -b | awk '{print $1}''
    totalsize=$(($totalsize + $filesize))
done < $1

echo "Total usage $totalsize bytes"

A variável filesize usa du para obter o tamanho do arquivo em bytes. A saída seria algo como:

15 file.txt

Considerando que precisaríamos apenas do 15 dessa saída, para analisar eu uso o awk, que imprime a primeira linha (os delimitadores são espaços)

Além disso, se você quiser excluir o arquivo, basta adicionar rm $filename no ciclo while

    
por Paulius Šukys 30.01.2015 / 10:24