digiwhite 15.10.2009 23:00

Скрипты на bashОпределение размера заданных файлов в заданной директории

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

Подумав немножко, написал следующий скрипт:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#
!/bin/bash

size=0
temp_file="sizes.tmp"

find $1 -maxdepth 1 -type f -name "$2" -fprintf $temp_file %s'\n' \

sizes=`cat ${temp_file}`

for i in $sizes ; do
let size=$size+i
done

rm $temp_file

printf %s "Total size is $size bytes, "
let ksize=$size/1024
printf %s "$ksize kbytes, "
let msize=$ksize/1024
printf %s "$msize mbytes"



После чего, например вызываем так (пусть скрипт носит название size.sh):
1
2
<digiwhite>$ chmod og+x size.sh
</digiwhite><digiwhite>$ ./size.sh ~/wallpapers \*.jpg</digiwhite>


В результате получаем размер, занимаемый файлами с расширением jpg в каталоге ~/wallpapers.

Теперь рассмотрим по строчкам, что делает скрипт:
#1 - тут и так все ясно, указываем интерпритатор сценария;
#4 - переменная, которая будет хранить размер в байтах;
#5 - переменная, которая хранит имя временного файла, в который будут заноситься размеры;
#7 - самая основная строка - с помощью утилиты find мы вполняем поиск в директории, заданной первым параметром при вызове скрипта. Параметр maxdepth ограничивает глубину сканирования 1 уровнем (можно убрать этот параметр и будут сканироваться все подкаталоги, начиная от заданного). Параметр -type f говорит утилите искать только файлы (симлинки будут пропускаться). Параметр -name "$2" определяет маску поиска, так же задаваемую во время вызова скрипта. -fprintf $temp_file %s'\n' указывает утилите find, что для каждого найденного файла выполнить печать его размера в файл, указанный в переменной $temp_file, при этом размер каждого файла будет находиться на новой строке;
#8 - получаем размеры всех найденных файлов;
#10-#12 - в цикле проходим по каждой записи (каждый размер файла) и суммируем их друг с другом;
#14 - удаляем временный файл, т.к. он больше не нужен;
#16-#20 - выводим результат в различных еденицах измерения информации

Такой вот способ. Вероятно способ несколько сложен, но тем не менее, мне он подошел :).


Тэги: bash find script скрипты
+ 1 -
Похожие Поделиться

philosoft 15.10.2009 23:59 #
Первое, что пришло в голову:
$ ls
002.jpg 058.jpg 096.jpg 143.jpeg 196.jpg 301.jpg 343.jpg 379.jpg
020.jpg 065.jpg 101.jpg 144.jpg 215.jpg 302.jpg 344.jpg 380.jpg
024.jpg 072.jpg 117.jpg 152.jpg 260.jpg 303.jpg 361.jpg 5.jpg
025.jpg 073.jpg 124.jpg 153.jpeg 269.jpg 304.jpg 363.jpg проч
036.jpg 080.jpg 129.jpeg 164.jpg 276.jpg 316.jpg 367.jpg
044.jpg 089.jpg 12.jpg 175.jpg 287.jpg 324.jpg 377.jpg
047.jpg 092.jpg 133.gif 195.jpg 290.jpg 336.jpg 378.jpg
$ du -ch `find . -maxdepth 1 -type f -iname \*jpg` | grep итого
18M итого
digiwhite 16.10.2009 00:12 #
Кстати, ваш вариант зависим от локализации ;) :-P
iglezz 16.10.2009 00:27 #
$ du -ch `find . -maxdepth 1 -type f -iname \*jpg` | tail -n 1
:)
digiwhite 16.10.2009 00:29 #
Завтра посмотрю, есть ли в QNX4 утилита du.
digiwhite 16.10.2009 00:05 #
Тоже вариант :) Думал как сделать в одну строчку, но про du не знал. На самом деле есть еще более простой вариант - через ls.
xT 16.10.2009 00:06 #
что мешает просто
du -ch /var/log/*.log | grep total?
xT 16.10.2009 00:15 #
du -ch /var/log/*.log | tail -n 1независим от локализации)))