Как мы вычисляем общий размер некоторых упомянутых файлов в каталоге.
Объясненный: у Меня есть в общей сложности 5 000 файлов в каталоге. я должен узнать только общий размер приблизительно 1 000 файлов.
На самом деле эти 1 000 файлов должны были быть удалены, но прежде, чем удалить нуждающийся для вычисления общих размеров этих файлов.
У меня есть имена и путь этих файлов в текстовом файле. Эти файлы находятся в форме PDF, flv, pptx и т.д. как:
/digi_en-gb/var/www/html/content/Collaborative_Games/multiplication/SB/08_Multiplication 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
Могут некоторые помогать мне со сценарием или командой достигнуть этого.
Если Вы имели , 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
Принятие Вас сохранило ПУТЬ файлов как следующий формат в 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
Я полностью еще не мог протестировать его, так как я не дома прямо сейчас, но маленький тест заставляю меня полагать, что сценарий ниже должен работать.
Это - отредактированная версия этого.
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>
Это показывает вывод как:
Ваш список должен иметь один путь к файлу на строку, никакие пустые строки (еще, он повысил бы ошибку).
#!/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)
Как насчет 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
Так как у Вас есть определенный список файлов, которые будут удалены, и нет никаких ограничений в моделировании решения, это является довольно прямым (удар):
#!/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
в в, в то время как цикл