Отримайте загальний розмір файлів із файлу, що містить список файлів


14

У мене є файл із переліком файлів, про які я хотів би знати загальний розмір файлів. Чи є команда зробити це?

Моя ОС - це дуже базовий Linux (Qnap TS-410).

Редагувати:

Кілька рядків з файлу:

/ share / archive / Bailey Test / BD006 / 0.tga
/ share / archive / Bailey / BD007 / 1 версія 1.tga
/ share / archive / Bailey 2 / BD007 / example.tga


Наведіть кілька прикладних рядків файлу.
ЄЕАА

Приклад із доданого файлу.
Ніколя

Це якась НАН, правда? У вас встановлений зайнятий ящик?
cjc

Так, і я думаю, це вже встановлено, чому?
Ніколя

Відповіді:


13

Я вважаю, що щось подібне спрацювало б у завантаженому ящику:

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 прямо в своїй публікації нижче, але показує використання диска, а не точний розмір файлів. Для зміни зайнятості поведінки використовується прапор -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}'. дякую mattias
Nicolas

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вирізає слово "всього".


Це не вдається, якщо список аргументів надто довгий. Мій список файлів великий. Відповідь нижче з xargs видається найпростішим рішенням.
Syclone0044

4

Я не знаю, чи здатні ваші інструменти Linux на це, але:

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

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

Дивлячись на http://busybox.net/downloads/BusyBox.html, здається, що "busybox du" буде підтримувати параметр "загальний", але "xargs для зайнятої скриньки" не підтримуватимуть спеціальні роздільники.

Знову ж таки, я не впевнений у вашому наборі інструментів.


ось результат:xargs: invalid option -- d
Ніколя

Дивовижно: робота з NASbox зайнятою linux - це як епізод Мак-Гюйвера, намагаючись створити робочий літак з якогось полотна, палички та шпагату.
cjc

Як щодо цього, якщо у вас є місце для цього на іншій машині: скопіюйте всі ті файли, які вас цікавлять, на якийсь інший, повністю функціональний linux, а потім запустіть рішення Stew там. Зробити це може бути набагато простіше, ніж намагатися з’ясувати, чи здатний busbox до подібних речей.
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}'

Це схоже на рішення Маттіаса Анберга. Використання "читання" дозволяє вирішити проблеми з назви файлів / каталогів з пробілами. Я використовую statзамість того, duщоб отримати розмір файлів. du отримує кількість місця, яке він використовує на диску, а не розмір файлів, який може бути різним. Залежно від вашої файлової системи, 1-байтний файл все одно буде займати 4 кб на диску (або будь-який розмір блоків). Отже, для файлу на 1 байт stat каже 1 байт, а du каже 4k.


Хороший коментар про розмір файлів проти дисків!
Маттіас Анберг

Дуже цікавий коментар, на жаль, мій Linux не знає statкоманди:stat: command not found
Ніколас

Можливо, вам доведеться сказати "statbox stat".
cjc

stat: applet not foundв цьому випадку сказано
Ніколя

4

Ось ще одне рішення проблеми:

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

Для мене (на 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}' 

дякую за ваш вклад, на жаль, я думаю, що проблема з пробілами в каталогах у моєму файлі не усунена "\".
Ніколя

Чи можете ви обійти список текстових файлів і просто генерувати це з виходу find?
ЄЕАА

на жаль, список занадто довгий, є 79159 рядків файлів (повний шлях), тому я виводжу його у файл; можливо, я можу додати аргумент про уникнення результату знахідки?
Ніколя

немає жодного аргументу "-print0" з знахідкою в моїй системі Linux
Nicolas

@Nicolas - це пов’язано з цим, використовуючи збитий findзамість реального findбінарного файлу зайнятий .
ЄЕАА

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.