URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8416
[ Назад ]

Исходное сообщение
"Помогите написать скрипт с использованием du и сложениями"

Отправлено Im27th , 01-Сен-09 12:56 
Вообще-то он должен работать под Solaris 8, но я думаю синкансис не очень отличается - главное структура.

Смысл вот в чём:

есть 3 директории
dir1
dir2
dir3
в них куча поддиректорий, включая нужную нам директорию data
все директории data одинаковы, к примеру

/dir1/data/orenburg
/dir1/data/saratov
/dir1/data/tallinn

/dir2/data/orenburg
/dir2/data/saratov
/dir2/data/tallinn

/dir3/data/orenburg
/dir3/data/saratov
/dir3/data/tallinn

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

orenburg 123G
saratov 65G
tallinn 227G

Хотя идеально было бы вообще вот так

orenburg 123G
dir1 50G
dir2 50G
dir3 23G

saratov 65G
dir1 20G
dir2 20G
dir3 25G

tallinn 227G
dir1 100G
dir2 100G
dir3 27G

Не пойму как по отдельной директории вытаскивать и потом всё это складывать.


Содержание

Сообщения в этом обсуждении
"Помогите написать скрипт с использованием du и сложениями"
Отправлено phpcoder , 01-Сен-09 13:02 
>Не пойму как по отдельной директории вытаскивать и потом всё это складывать.

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


"Помогите написать скрипт с использованием du и сложениями"
Отправлено akiri4 , 02-Сен-09 10:25 
>>Не пойму как по отдельной директории вытаскивать и потом всё это складывать.
>
>Возможно, что стоит вычислять размер в байтах -- их складывать и потом
>уже переводить в человеко-читаемую форму (или вовсе так и оставлять в
>байтах).

Pahanivo, в общем то прав. Вот чуть детально (если я конечно правельно вас понял):
#!/bin/sh
find /usr/local/etc -type d -name "rc.d" -print  | du -d5 -h  | awk '{print $1}' | xargs
(директория поиска)        (шаблон поиска)  ( -d глубина вложенности)           
-n1 echo "dir1"
      

По поводу подсчета: awk '{total +=$1}; END {print total}'
        (смотрит первое поле)

Если что то не понятно, пиши попробуем разобраться, по крайней мере тебе будет куда копать и что искать.



"Помогите написать скрипт с использованием du и сложениями"
Отправлено Pahanivo , 02-Сен-09 10:27 
>[оверквотинг удален]
>(директория поиска)        (шаблон поиска)  
>( -d глубина вложенности)
>-n1 echo "dir1"
>
>
>По поводу подсчета: awk '{total +=$1}; END {print total}'
>  (смотрит первое поле)
>
>Если что то не понятно, пиши попробуем разобраться, по крайней мере тебе
>будет куда копать и что искать.

Уважаемый, дайте товарисчу хоть чуток напряч извилины. Он ведь даже попытки не сделал )


"Помогите написать скрипт с использованием du и сложениями"
Отправлено akiri4 , 02-Сен-09 10:36 
>[оверквотинг удален]
>>
>>
>>По поводу подсчета: awk '{total +=$1}; END {print total}'
>>  (смотрит первое поле)
>>
>>Если что то не понятно, пиши попробуем разобраться, по крайней мере тебе
>>будет куда копать и что искать.
>
>Уважаемый, дайте товарисчу хоть чуток напряч извилины. Он ведь даже попытки не
>сделал )

Да ладно тебе ;) я очень приблизительно написал. Будем считать, что это маленький намек, чтобы человек не потерял энтузиазм к решению проблемы )))



"Помогите написать скрипт с использованием du и сложениями"
Отправлено Im27th , 02-Сен-09 11:24 
Думаете я извилины не нарягаю?

Я пришёл на новую работу, а мне тут сразу и Oracle мониторить, и испытать как работает Solaris 8 в контейнере Solaris 10, и изучить lustre и samfs, и ещё скрипты писать - времени ваще нету и облажаться тоже не хочется.

Поэтому и прошу помощи.


"Помогите написать скрипт с использованием du и сложениями"
Отправлено Pahanivo , 01-Сен-09 14:25 
man find, xargs, du, awk, csh


"Помогите написать скрипт с использованием du и сложениями"
Отправлено ACCA , 04-Сен-09 00:04 
Не нужно писать подсуммы с перестановками на shell, в Solaris для этого есть Perl.

du -s */* | perl -e 'while (<>) { ($s,$d1, $d2) = split /[\s\/]+/; $size{$d2}{$d1} = $s; $size{$d2}{"\rTOTAL"}+= $s; } foreach $d2 (keys %size) { foreach $d1 (sort keys %{$size{$d2}}) {print "\t$d1 $d2 $size{$d2}{$d1}\n";}}'


"Помогите написать скрипт с использованием du и сложениями"
Отправлено Im27th , 04-Сен-09 10:02 
>Не нужно писать подсуммы с перестановками на shell, в Solaris для этого
>есть Perl.
>
>du -s */* | perl -e 'while (<>) { ($s,$d1, $d2) = split /[\s\/]+/; $size{$d2}{$d1} = $s; $size{$d2}{"\rTOTAL"}+= $s; } foreach $d2 (keys %size) { foreach $d1 (sort keys %{$size{$d2}}) {print "\t$d1 $d2 $size{$d2}{$d1}\n";}}'

Perl - классно. Попробую разобраться.
А пока что вот что вышло (тестирую на CentOS):

find /dir1/data -maxdepth 1 -mindepth 1 -type d | cut -d/ -f4 > 1.txt;
j=`cat 1.txt | wc -l`
i=1
for i in {1,2,3}
do
CURDIR=`head -n $i 1.txt | tail -1`
du -k -s -c /dir*/data/$CURDIR
done

Теперь:
1. В Solaris нет maxdepth mindepth
2. В Solaris нет du -c
3. Не могу сделать нормальный цикл - как сделать, чтобы было не for i in {1,2,3} а for i и количество циклов раное j

4. Пока разбираюсь с этим - следующим пунктом народу захотелось, чтобы ещё напротив каждого каталога стояла время последней его модификации.
Я понимаю, что надо что-то типа ls -lc, но как бы одну дату вытащить без всей мишуры?
Или опять заталкивать в файл и обрезать?


"Помогите написать скрипт с использованием du и сложениями"
Отправлено Im27th , 04-Сен-09 15:59 
O! Замутил!

find /dir1/data -maxdepth 1 -mindepth 1 -type d | cut -d/ -f4 > spisok.txt;
j=`cat spisok.txt | wc -l`
i=1
a=1
for i in {1,2,3}
do
CURDIR=`head -n $i spisok.txt | tail -1`
echo "Проект $CURDIR"
du -k -s -c /dir*/data/$CURDIR > du$i.txt
ls -dlc /dir*/data/$CURDIR > ls$i.txt
cut -f2 du$i.txt > dir$i.txt
cut -b8-10 dir$i.txt > subdir$i.txt
cut -f1 du$i.txt > size$i.txt
cut -b29-44 ls$i.txt > date$i.txt
for a in {1,2,3}
do
head -n $a subdir$i.txt  | tail -1 > onedir$a.txt
head -n $a size$i.txt  | tail -1 > onesize$a.txt
head -n $a date$i.txt  | tail -1 > onedate$a.txt
VIVOD=`cat onedir$a.txt onesize$a.txt onedate$a.txt`
echo $VIVOD
rm onedir$a.txt
rm onesize$a.txt
rm onedate$a.txt
done
echo
rm du$i.txt
rm ls$i.txt
rm dir$i.txt
rm subdir$i.txt
rm size$i.txt
rm date$i.txt
done
rm spisok.txt

Только вот с циклом так и не разобрался. У меня ведь неизвестное и меняющееся количество поддиректорий.


"Помогите написать скрипт с использованием du и сложениями"
Отправлено Im27th , 14-Сен-09 14:07 
O! Какая хрень получилась

find /bigsan0/data -maxdepth 1 -mindepth 1 -type d | cut -d/ -f4 > spisok.txt;
SUBDIR=`find /bigsan0/data -maxdepth 1 -mindepth 1 -type d | cut -d/ -f4`
j=`cat spisok.txt | wc -l`
i=1
for files in ${SUBDIR}/*
do
CURDIR=`head -n $i spisok.txt | tail -1`
echo "Проект $CURDIR"
du -k -s -c /bigsan*/data/$CURDIR > du$i.txt
ls -dlc /bigsan*/data/$CURDIR > ls$i.txt
cut -f2 du$i.txt > dir$i.txt
cut -b1-8 dir$i.txt > subdir$i.txt
cut -f1 du$i.txt > size$i.txt
cut -f7-10 -d' ' ls$i.txt > date$i.txt
a=1
b=`cat subdir$i.txt | wc -l`
c=`cut -b1-8 dir$i.txt`
#for a in {1,2,3,4}
for word in ${c}
do
head -n $a subdir$i.txt  | tail -1 > onedir$a.txt
head -n $a size$i.txt  | tail -1 > onesize$a.txt
head -n $a date$i.txt  | tail -1 > onedate$a.txt
VIVOD=`cat onedir$a.txt onesize$a.txt onedate$a.txt`
echo $VIVOD
#echo $i
#echo $j
#echo $a
rm onedir$a.txt
rm onesize$a.txt
rm onedate$a.txt
a=`expr ${a} + 1`
done
echo
rm du$i.txt
rm ls$i.txt
rm dir$i.txt
rm subdir$i.txt
rm size$i.txt
rm date$i.txt
i=`expr ${i} + 1`
done
rm spisok.txt