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

Ubuntu использует выскочку init демон который начальными загрузками по умолчанию к (эквивалент?) runlevel 2. Если Вы хотите измениться, значение по умолчанию runlevel затем создают/etc/inittab с initdefault записью для runlevel, который Вы хотите.

:id:3:initdefault:

принес бы системе до runlevel 3.

Статья о нем здесь

13
задан 19 January 2012 в 19:49
7 ответов

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

13
ответ дан 2 December 2019 в 21:19
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.

4
ответ дан 2 December 2019 в 21:19

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

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

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

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

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

4
ответ дан 2 December 2019 в 21:19

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

$ 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}' 
2
ответ дан 2 December 2019 в 21:19

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

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-
4
ответ дан 2 December 2019 в 21:19
du -c `cat filelist.txt` | tail -1 | cut -f 1

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

.
7
ответ дан 2 December 2019 в 21:19

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

1
ответ дан 2 December 2019 в 21:19

Теги

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