Не знаю, почему так сложилась судьба 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
Комментариев нет:
Отправить комментарий