Назад | Перейти на главную страницу

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

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

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

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

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

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

Я считаю, что что-то подобное сработает в 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" для точного размера файла и сравните вывод / поведение.

du -c `cat filelist.txt` | tail -1 | cut -f 1

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

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

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

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

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

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

while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

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

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

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-

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

$ 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}' 

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