Автор Гілка: Запутавсь у bash...  (Прочитано 3636 раз)

Відсутній Sirko

  • Графоман
  • ****
  • дописів: 299
  • Карма: +0/-0
  • Що новенького?
Запутавсь у bash...
« : 2005-10-25 15:25:36 »
Доброго дня всім!
Є директорія, наприклад /repos, яка містить інші директорії які також включають в себе директорії (типу /repos/dir1/subdir1, /repos/dir2/subdir2, /repos/dir3/subdir3 і т.д.). Хочу написати скрипт, який би брав папки першого рівня в директорії /repos (dir1, dir2, dir3 без папки /repos) додавав їх в архів, який мав би ім'я dir_name-date.tar.bz2 і копіював їх в іншу папку (можливо по мережі). Наваяв от такий скриптик:
#!/bin/bash

#====================================
DIR=`cd / && find repos/ -maxdepth 1 -type d`
TAR=/bin/tar
NDATE=`date +%F`
BACKUP_DIR=tmp/repos_backup
#====================================
cd /
for i in $DIR
do
$TAR cjfp $BACKUP_DIR/$DIR-$NDATE.tar.bz2 $DIR --exclude=repos
done
але вискакує помилка
/bin/tar: tmp/repos_backup/repos/: Cannot open: Is a directory
/bin/tar: Error is not recoverable: exiting now
./backup.sh: line 18:   552 Broken pipe             $TAR cjfp $BACKUP_DIR/$DIR-$NDATE.tar.bz2 $DIR --exclude=repos

Підкажіть, як це все діло правильно оформити. Наперед вдячний за відповідь.
[Kubuntu User]

Відсутній old

  • Дописувач
  • **
  • дописів: 60
  • Карма: +0/-0
  • Що новенького?
Re: Запутавсь у bash...
« Відповідей #1 : 2005-10-25 18:36:24 »
Не претендую на оригінальність але...
Помоєму проблема власне в tar опціях. Спробуйте вставити в циклі do done спочатку echo $DIR а потім echo тої команди ($TAR.....) побачите, яка власне кажуич команда (і на якій ітерації) збоїть. Після цього вже можна пробувати її (ту збійну команду) пробувати прямо з командлайну, поки не розберетесь з ключами.
Принаймні я "дебагаю" скріпти саме так.

Відсутній miwa

  • Літератор
  • ******
  • дописів: 1111
  • Карма: +0/-0
Re: Запутавсь у bash...
« Відповідей #2 : 2005-10-25 18:39:45 »
Принаймні я "дебагаю" скріпти саме так.
Кгм....
"доладжую сценарії"
Ось...
Читайте документацію - вона кермує.

Відсутній Yaroslav Fedevych

  • Літератор
  • ******
  • дописів: 1069
  • Карма: +0/-0
  • Людина — ніщо, справа — все
Re: Запутавсь у bash...
« Відповідей #3 : 2005-10-25 19:00:28 »
Цитата
for i in $DIR
do
$TAR cjfp $BACKUP_DIR/$DIR-$NDATE.tar.bz2 $DIR --exclude=repos
done

А може, в третьому рядку s/\$DIR/i/g ?

Відсутній old

  • Дописувач
  • **
  • дописів: 60
  • Карма: +0/-0
  • Що новенького?
Re: Запутавсь у bash...
« Відповідей #4 : 2005-10-25 19:31:07 »
"доладжую сценарії"
Ось...
Перепрошую за жаргонізми :) Так просто думка біжить....
Постараюсь в мабутньому висловлюватись більш грамтоно. :)

Відсутній Sirko

  • Графоман
  • ****
  • дописів: 299
  • Карма: +0/-0
  • Що новенького?
Re: Запутавсь у bash...
« Відповідей #5 : 2005-10-25 21:47:56 »
А може, в третьому рядку s/\$DIR/i/g ?
Де саме? Там де назва архіву чи там де назва директорій, які архівуються? І що це означа?
[Kubuntu User]

Відсутній Yaroslav Fedevych

  • Літератор
  • ******
  • дописів: 1069
  • Карма: +0/-0
  • Людина — ніщо, справа — все
Re: Запутавсь у bash...
« Відповідей #6 : 2005-10-25 23:46:33 »
Я про те, що циклюємо $DIR через $i, тож і використовувати треба не $DIR на кожній ітерації, а $i.

Відсутній Sirko

  • Графоман
  • ****
  • дописів: 299
  • Карма: +0/-0
  • Що новенького?
Re: Запутавсь у bash...
« Відповідей #7 : 2005-10-26 09:57:38 »
Я про те, що циклюємо $DIR через $i, тож і використовувати треба не $DIR на кожній ітерації, а $i.
Ні, нажаль не воно. Мені тут показали приклад, в якому це робиться:
cd /
find repos/ -mindepth 1 -maxdepth 1 -type d | \
    awk -F/ -v d=`date -I` '{printf "%s-%s.tar.bz2 %s\n", $2, d, $0'} | \
        xargs -l1 tar cfjp
я його трохи підправив під себе а зараз сиджу і розбираюсь з awk і що означа строка
   awk -F/ -v d=`date -I` '{printf "%s-%s.tar.bz2 %s\n", $2, d, $0'}
якщо є спеціалісти цієї справи, то мо підкажете :)
[Kubuntu User]

Відсутній miwa

  • Літератор
  • ******
  • дописів: 1111
  • Карма: +0/-0
Читайте документацію - вона кермує.

Відсутній tech

  • Письменник
  • *****
  • дописів: 586
  • Карма: +1/-0
  • Гигик
Re: Запутавсь у bash...
« Відповідей #9 : 2005-10-26 10:32:35 »
Я не спеціаліст, але це не надто важко:

find /repos -mindepth 1 -maxdepth 1 -type d
Виводить назви каталогів з repos у формі:
something/
something_else/
yet_one_more/

awk -F/ -v d=`date -I` '{printf "%s-%s.tar.bz2 %s\n", $2, d, $0'}

-F/   --(field separator) розділювач полів, вказує роглядати / як поділ між окремими ланцюжками (strings) виводу
-v d=`date -I`  --  (variable assignment) надає значення змінній d (вивід date -I)
printf "%s-%s.tar.bz2 %s\n"  -- подібний на C printf вираз, із %s вказівником формату (string)
$2, d, $0'  -- аргументи printf (не зовсім розумію чому саме $2), d - це змінна з датою, $0 - це перше поле оригінального виводу до / знака.

З $2 розбираюсь у даний момент.

Для / у мене вивід наступний:

(nabis:/)$ find / -mindepth 1 -maxdepth 1 -type d | \
> awk -F/ -v d=`date "+%Y_%m_%d"` '{printf "%s-%s.tar.bz2 %s\n", $2, d, $0'}
altroot-2005_10_25.tar.bz2 /altroot
bin-2005_10_25.tar.bz2 /bin
dev-2005_10_25.tar.bz2 /dev
etc-2005_10_25.tar.bz2 /etc
home-2005_10_25.tar.bz2 /home
mnt-2005_10_25.tar.bz2 /mnt
root-2005_10_25.tar.bz2 /root
sbin-2005_10_25.tar.bz2 /sbin
stand-2005_10_25.tar.bz2 /stand
tmp-2005_10_25.tar.bz2 /tmp
usr-2005_10_25.tar.bz2 /usr
var-2005_10_25.tar.bz2 /var
lost+found-2005_10_25.tar.bz2 /lost+found
« Змінено: 2005-10-26 10:34:06 від tech »

Відсутній Sirko

  • Графоман
  • ****
  • дописів: 299
  • Карма: +0/-0
  • Що новенького?
Re: Запутавсь у bash...
« Відповідей #10 : 2005-10-26 13:08:08 »
Я не спеціаліст, але це не надто важко:

find /repos -mindepth 1 -maxdepth 1 -type d
Виводить назви каталогів з repos у формі:
something/
something_else/
yet_one_more/
З цим і в мене проблем не виникло :)
А от з awk... Буду вчити. Хоча мені має бути соромно - як не як дипломований інженер програміст з напрямку системне програмування.... От що робе з людЯми windoze :)

awk -F/ -v d=`date -I` '{printf "%s-%s.tar.bz2 %s\n", $2, d, $0'}

-F/   --(field separator) розділювач полів, вказує роглядати / як поділ між окремими ланцюжками (strings) виводу
-v d=`date -I`  --  (variable assignment) надає значення змінній d (вивід date -I)
printf "%s-%s.tar.bz2 %s\n"  -- подібний на C printf вираз, із %s вказівником формату (string)
$2, d, $0'  -- аргументи printf (не зовсім розумію чому саме $2), d - це змінна з датою, $0 - це перше поле оригінального виводу до / знака.
Мда, мани читати ніколи не пізно....
З $2 розбираюсь у даний момент.
Я теж :)
Для / у мене вивід наступний:

(nabis:/)$ find / -mindepth 1 -maxdepth 1 -type d | \
> awk -F/ -v d=`date "+%Y_%m_%d"` '{printf "%s-%s.tar.bz2 %s\n", $2, d, $0'}
altroot-2005_10_25.tar.bz2 /altroot
bin-2005_10_25.tar.bz2 /bin
dev-2005_10_25.tar.bz2 /dev
etc-2005_10_25.tar.bz2 /etc
home-2005_10_25.tar.bz2 /home
mnt-2005_10_25.tar.bz2 /mnt
root-2005_10_25.tar.bz2 /root
sbin-2005_10_25.tar.bz2 /sbin
stand-2005_10_25.tar.bz2 /stand
tmp-2005_10_25.tar.bz2 /tmp
usr-2005_10_25.tar.bz2 /usr
var-2005_10_25.tar.bz2 /var
lost+found-2005_10_25.tar.bz2 /lost+found
В принципі, я зрозумів, що робе даний скрипт за допомогою awk.  Тепер лишилось впритул зайнятись awk і мабуть sed щоб надалі не задавати таких дурних питань :)
[Kubuntu User]