Вообще-то он должен работать под 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 23Gsaratov 65G
dir1 20G
dir2 20G
dir3 25Gtallinn 227G
dir1 100G
dir2 100G
dir3 27GНе пойму как по отдельной директории вытаскивать и потом всё это складывать.
>Не пойму как по отдельной директории вытаскивать и потом всё это складывать.Возможно, что стоит вычислять размер в байтах -- их складывать и потом уже переводить в человеко-читаемую форму (или вовсе так и оставлять в байтах).
>>Не пойму как по отдельной директории вытаскивать и потом всё это складывать.
>
>Возможно, что стоит вычислять размер в байтах -- их складывать и потом
>уже переводить в человеко-читаемую форму (или вовсе так и оставлять в
>байтах).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}'
(смотрит первое поле)Если что то не понятно, пиши попробуем разобраться, по крайней мере тебе будет куда копать и что искать.
>[оверквотинг удален]
>(директория поиска) (шаблон поиска)
>( -d глубина вложенности)
>-n1 echo "dir1"
>
>
>По поводу подсчета: awk '{total +=$1}; END {print total}'
> (смотрит первое поле)
>
>Если что то не понятно, пиши попробуем разобраться, по крайней мере тебе
>будет куда копать и что искать.Уважаемый, дайте товарисчу хоть чуток напряч извилины. Он ведь даже попытки не сделал )
>[оверквотинг удален]
>>
>>
>>По поводу подсчета: awk '{total +=$1}; END {print total}'
>> (смотрит первое поле)
>>
>>Если что то не понятно, пиши попробуем разобраться, по крайней мере тебе
>>будет куда копать и что искать.
>
>Уважаемый, дайте товарисчу хоть чуток напряч извилины. Он ведь даже попытки не
>сделал )Да ладно тебе ;) я очень приблизительно написал. Будем считать, что это маленький намек, чтобы человек не потерял энтузиазм к решению проблемы )))
Думаете я извилины не нарягаю?Я пришёл на новую работу, а мне тут сразу и Oracle мониторить, и испытать как работает Solaris 8 в контейнере Solaris 10, и изучить lustre и samfs, и ещё скрипты писать - времени ваще нету и облажаться тоже не хочется.
Поэтому и прошу помощи.
man find, xargs, du, awk, csh
Не нужно писать подсуммы с перестановками на 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";}}'
>Не нужно писать подсуммы с перестановками на 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 и количество циклов раное j4. Пока разбираюсь с этим - следующим пунктом народу захотелось, чтобы ещё напротив каждого каталога стояла время последней его модификации.
Я понимаю, что надо что-то типа ls -lc, но как бы одну дату вытащить без всей мишуры?
Или опять заталкивать в файл и обрезать?
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Только вот с циклом так и не разобрался. У меня ведь неизвестное и меняющееся количество поддиректорий.
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