Получить общий размер файла из файла, содержащего список файлов

14

У меня есть файл, содержащий список файлов, которые я хотел бы узнать общий размер файлов. Есть ли команда для этого?

Моя ОС - это очень простой Linux (Qnap TS-410).

РЕДАКТИРОВАТЬ:

Несколько строк из файла:

/ поделиться / архив / Bailey Test / BD006 / 0.tga
/ поделиться / архив / Bailey / BD007 / 1 версия 1.tga
/ поделиться / архив / Bailey 2 / BD007 / example.tga

никола
источник
Дайте нам несколько примеров строк файла.
EEAA
Пример из файла добавлен.
Николя
Это какой-то NAS, верно? У вас установлен busybox?
CJC
Да, и я думаю, что он уже установлен, почему?
Николас

Ответы:

13

Я полагаю, что-то вроде этого будет работать в busybox:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

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

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

Изменить 1 :
@stew прямо в своем посте ниже, du показывает использование диска, а не точный размер файла. Чтобы изменить поведение busybox использует флаг -a, поэтому попробуйте: du -a "$file"для точного размера файла и сравните вывод / поведение.

Маттиас Анберг
источник
1
Спасибо за ваш ввод, первая команда возвращает /usr/bin/du: Argument list too long(почти 80 000 строк в моем файле). Ваша вторая команда просто дает мне подсказку, когда я нажимаю Enter, ожидая чего-то большего?
Николас
Трудно сказать с вашей средой. Это обычная командная строка или просто мигающая подсказка? Если это последнее, то это может быть медленным ожиданием результата, если это «приглашение ввода», возможно, вы пропустили какой-то символ? И если это обычная подсказка, я не знаю, я проверил ее довольно тщательно, прежде чем набрать ее. :(
Маттиас Анберг
это «запрос ввода», когда я делаю следующее cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'. спасибо маттиас
Николя
1
Ах! Если вы помещаете все в одну строку, вам нужна другая; как это: cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(то есть, прежде чем сделать).
Маттиас Анберг
Пятно на! Работало отлично, ура! (хотя я мог бы понять эту ошибку сам)
Николас
8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-cдобавляет строку «общий размер»;
tail -1занимает последнюю строку (с общим размером);
cut -f 1вырезает слово «всего».

olegzhermal
источник
Это не удается, если список аргументов du слишком длинный. Мой список файлов большой. Приведенный ниже ответ с xargs представляется наиболее простым решением.
Syclone0044
4

Я не знаю, способны ли ваши инструменты Linux на это, но:

cat /tmp/filelist.txt  |xargs -d \\n du -c

Сделайте так, xargs установит разделитель как символ новой строки, а du произведет для вас общий итог.

Глядя на http://busybox.net/downloads/BusyBox.html, кажется, что «busybox du» будет поддерживать опцию общего итога, но «busybox xargs» не будет поддерживать пользовательские разделители.

Опять же, я не уверен в вашем наборе инструментов.

CJC
источник
вот результат:xargs: invalid option -- d
Николя
Удивительно: работать с linux busybox NAS похоже на эпизод McGuyver, пытаясь построить работающий самолет из холста, палок и шпагата.
CJC
Как насчет этого, если у вас есть место для этого на другом компьютере: скопируйте все те файлы, которые вас интересуют, в какой-то другой, полностью функциональный linux, а затем запустите там решение Stew. Это может быть намного проще, чем пытаться выяснить, способен ли busybox на подобные вещи.
CJC
1
Я думаю, что ответ является лучшим. Это сжато и гораздо быстрее, чем другие ответы в этой теме.
Зиман
Хороший ответ. Возможно, вы захотите пропустить, -cтак как xargs будет делать несколько вызовов, duесли список файлов достаточно длинный, производя несколько duитогов.
Qwr
4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

Это похоже на решение Маттиаса Анберга. Использование «read» позволяет обойти проблемы с именами файлов / каталогами с пробелами. Я использую statвместо того, duчтобы получить размер файла. du получает объем памяти, который он использует на диске, а не размер файла, который может отличаться. В зависимости от вашей файловой системы, 1-байтовый файл все равно будет занимать 4 КБ на диске (или каков бы ни был размер блока). Таким образом, для 1-байтового файла stat сообщает 1 байт, а du - 4k.

тушеное мясо
источник
Хороший комментарий по поводу размера файла против размера диска!
Маттиас Анберг
Действительно, очень интересный комментарий, к сожалению, мой linux не знает statкоманду:stat: command not found
Nicolas
Возможно, вам придется сказать "статистика занятости".
CJC
это говорит stat: applet not foundв этом случае
Николя
4

Вот еще одно решение проблемы:

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-
dsamarin
источник
Для меня (на Cygwin) du -bcработает намного быстрее.
Qwr
2

Попробуйте что-то вроде этого:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

Чтобы правильно обрабатывать пробелы в путях:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 
EEAA
источник
спасибо за ваш вклад, к сожалению, я думаю, что есть проблема с пробелами в каталогах в моем файле, которые не экранируются с помощью "\"., поэтому он ломается при просмотре списка файлов.
Николас
Можете ли вы обойти список текстовых файлов и просто сгенерировать это на выходе find?
EEAA
к сожалению, список слишком длинный, 79159 строк файлов (полный путь), поэтому я вывожу его в файл; может быть, я могу добавить аргумент об экранировании результата поиска?
Николя
в моей системе linux нет аргумента "-print0" с поиском
Nicolas
@Nicolas - это связано с тем, что findвместо реального findдвоичного файла используется урезанный busybox .
EEAA
1

cat docs.txt | xargs -d \\n du -sk | awk '{total+=$1} END{print total}'

Прадип
источник