У меня есть файл, содержащий список файлов, общий размер которых я хотел бы узнать. Есть ли на это команда?
Моя ОС - это очень простой 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}'