The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Помогите написать скрипт с использованием 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, 13:02 , 01-Сен-09 (1)
    >Не пойму как по отдельной директории вытаскивать и потом всё это складывать.

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

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

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

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

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

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


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

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

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

  • Помогите написать скрипт с использованием du и сложениями, !*! Pahanivo, 14:25 , 01-Сен-09 (2)
  • Помогите написать скрипт с использованием du и сложениями, !*! ACCA, 00:04 , 04-Сен-09 (13)
    Не нужно писать подсуммы с перестановками на 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, 10:02 , 04-Сен-09 (15)
      >Не нужно писать подсуммы с перестановками на 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, 15:59 , 04-Сен-09 (17)
        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:07 , 14-Сен-09 (18)
          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




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

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