Общее количество конкретного размера файлов в каталоге

Как мы вычисляем общий размер некоторых упомянутых файлов в каталоге.

Объясненный: у Меня есть в общей сложности 5 000 файлов в каталоге. я должен узнать только общий размер приблизительно 1 000 файлов.

На самом деле эти 1 000 файлов должны были быть удалены, но прежде, чем удалить нуждающийся для вычисления общих размеров этих файлов.

У меня есть имена и путь этих файлов в текстовом файле. Эти файлы находятся в форме PDF, flv, pptx и т.д. как:

/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

Могут некоторые помогать мне со сценарием или командой достигнуть этого.

-1
задан 2 February 2015 в 03:57

5 ответов

Если Вы имели , NUL завершился список файлов, то Вы могли использовать --files0-from= опция du. От 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

Вы могли преобразовать разделенный от новой строки список в NUL-разделенный список с помощью tr, например,

tr '\n' '\0' < filelist > filelist0

Тогда

du -sch --files0-from=filelist0

, Если Вы хотите видеть [только 1 111] общее количество, затем передать результат по каналу до tail

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

, Чтобы постараться не генерировать дополнительный файл, Вы могли сделать что-то вроде этого вместо этого

tr '\n' '\0' < filelist | du -sch --files0-from=- | tail -n 1
2
ответ дан 6 October 2019 в 02:46

Принятие Вас сохранило ПУТЬ файлов как следующий формат в list файл:

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

И попробуйте ниже команды, которая звонит du -h окружите команду из awk для каждой строки ($0) из 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

Поскольку Вы видите, что это покажет Вам размер каждого .pdf и .flv файлов в на строку.

Теперь, если Вы хотите вычислить сумму всего использования размеров файла awkследующим образом:

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

Кроме того, можно использовать rm команда в awk как tha то же как du управляйте к запросу подобранного файла включая его размер в левом и хите Y/N к удалению выбранного файла. посмотрите на шагах:

$ 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
1
ответ дан 6 October 2019 в 02:46

Я полностью еще не мог протестировать его, так как я не дома прямо сейчас, но маленький тест заставляю меня полагать, что сценарий ниже должен работать.

Это - отредактированная версия этого.

Как использовать

  • Скопируйте сценарий ниже в пустой файл, сохраните его как calculate_size.py.
  • откройте окно терминала, введите следующую команду:

    python3 /path/to/calculate_size.py </path/to/your/textfile/with/a/filelist>
    
  • Отметьте, нужно ли Вам sudo полномочия в каталогах wher файлы вынужденно хранят, запускают скрипт с sudo:

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

Это показывает вывод как:

enter image description here

Ваш список должен иметь один путь к файлу на строку, никакие пустые строки (еще, он повысил бы ошибку).

Сценарий

#!/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)
1
ответ дан 6 October 2019 в 02:46

Как насчет find и du в терминале (колотят хорошо)?

Например, для нахождения всех файлов pdf и дисплея могло использовать:

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

Или используйте любой шаблон, вместо которого Вы хотите *.pdf

Или для единственных размеров байта, используйте du опция --block-size=1

Вышеупомянутые шоу дисковое пространство, используемое файлами, для показа "очевидного размера" (что ls обычно шоу), используют du опция --apparent-size

Или, покажите только общий итог (du -s) и объедините некоторые опции показать очевидный размер файла в 1 байте:

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

Хотите отключить информацию о пути и показать только байты? Добавить | cut -f 1

Посмотрите man или info страницы для find, xargs, и du для большего количества информации.


После того, как вопрос был отредактирован, чтобы добавить, что файлы находятся в текстовом файле, может все еще использовать xargs наряду с он - опция:

--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.

Так:

xargs --arg-file=file du -bs
0
ответ дан 6 October 2019 в 02:46

Так как у Вас есть определенный список файлов, которые будут удалены, и нет никаких ограничений в моделировании решения, это является довольно прямым (удар):

#!/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"

filesize переменное использование du получить размер файла в байтах. Вывод был бы чем-то как:

15 file.txt

тогда как нам было бы нужно только 15 от того вывода для парсинга я использую awk, которые печатают первую строку (разделители являются пробелами),

Дополнительно, если Вы хотите удалить файл также, просто добавьте rm $filename в в, в то время как цикл

0
ответ дан 6 October 2019 в 02:46

Другие вопросы по тегам:

Похожие вопросы: