вторник, 8 ноября 2016 г.

Linux подсчет размера всех файлов в директории

Не знаю, почему так сложилась судьба Windows, но в свойствах директории указывается суммарный размер файлов, которые находятся в ней, в том числе в подкаталогах. При этом размер самих директорий не учитывается - указывается только их количество.

В мире Linux все гораздо понятнее - каждая директория занимает какое-то место, поэтому ее размер входит в суммарный размер.

Задача - сделать как на Windows.

1. Попытка сделать через find + du
  du -b -c `find $1 -type f ` | tail -1

Минусы в игнорировании файлов с пробелами:
 bash-4.1$ du -b -c `find testdir -type f`
du: невозможно получить доступ к <<
testdir/1>>: Нет такого файла или каталога
du: невозможно получить доступ к <<2.txt>>: Нет такого файла или каталога
6      
testdir/2/4.txt
23     
testdir/2/3.txt
29      итого
bash-4.1$ find 
testdirtestdir/1 2.txttestdir/2testdir/2/4.txttestdir/2/3.txt






Еще один минус - ограничение на количество операндов:

  du -b -c `find /home/skobelev -type f`
 /usr/bin/du: Слишком длинный список аргументов
 bash-4.1$ find /home/skobelev/ | wc
 153307  214391 12042757

2. Вариант ls + awk

ls -lGR 1 | awk '{ if ($2==1) total += $4; }; END { print total }' 

bash-4.1$ ls -lGR testdir | awk '{ if ($2==1) total += $4; }; END { print total }';
33
bash-4.1$ ls -lGR
testdir:
итого 8
-rw-r--r-- 1 skobelev    4 Ноя  8 15:27 1 2.txt
drwxr-xr-x 2 skobelev 4096 Ноя  7 17:04 2
testdir/2:
итого 8
-rw-r--r-- 1 skobelev 23 Ноя  7 16:56 3.txt
-rw-r--r-- 1 skobelev  6 Ноя  7 17:04 4.txt



Кстати и по скорости этот вариант лучше работает:
bash-4.1$ time ./size_of_files_only.sh /home/skobelev/Downloads/
116902412012 итого

real    0m0.197s
user    0m0.092s
sys     0m0.070s

bash-4.1$ time ./size_of_files_only2.sh /home/skobelev/Downloads/
131521835169

real    0m0.049s
user    0m0.026s
sys     0m0.029s







Комментариев нет:

Отправить комментарий