The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Помогите написать скрипт с использованием du и сложениями"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Помогите написать скрипт с использованием du и сложениями"  +/
Сообщение от Im27th (ok) on 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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Помогите написать скрипт с использованием du и сложениями"  +/
Сообщение от akiri4 on 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}'
        (смотрит первое поле)

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Помогите написать скрипт с использованием du и сложениями"  +/
Сообщение от Im27th (ok) on 02-Сен-09, 11:24 
Думаете я извилины не нарягаю?

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Помогите написать скрипт с использованием du и сложениями"  +/
Сообщение от Pahanivo email(ok) on 01-Сен-09, 14:25 
man find, xargs, du, awk, csh

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "Помогите написать скрипт с использованием du и сложениями"  +/
Сообщение от ACCA (ok) on 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";}}'

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "Помогите написать скрипт с использованием du и сложениями"  +/
Сообщение от Im27th (ok) on 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, но как бы одну дату вытащить без всей мишуры?
Или опять заталкивать в файл и обрезать?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

17. "Помогите написать скрипт с использованием du и сложениями"  +/
Сообщение от Im27th (ok) on 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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

18. "Помогите написать скрипт с использованием du и сложениями"  +/
Сообщение от Im27th (ok) on 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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру