Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » SH скрипт копирования каталога

Ответить
Настройки темы
SH скрипт копирования каталога

Новый участник


Сообщения: 9
Благодарности: 0


Конфигурация

Профиль | Отправить PM | Цитировать


Добрый день!

Прошу помочь, пишу скрипт копирования целевой папки (внутри папки вложенная структура папок и файлов) в каталоги, список которых перечислен в текстовом файле (каждая строчка - новый каталог с указание пути относительно корня). Однако выполнение скрипта ни к чему не приводит..Помогите пожалуйста.


Пример содержимого текстового файла:
/home/centrin/domains/sites.ru/public_html/new/
/home/centrin/domains/home.ru/public_html/

Вот sh скрипт:
#!/bin/sh

if [ $# -ne 2 ]
then
echo "Параметры вызова: ([директория], [файл с адресами])"
exit
fi

PATHS_FILE=$2
TARGET_DIR=$1

if !([ -d $TARGET_DIR ])
then
echo "Заданная директория не найдена"
exit
fi

if !([ -f $PATHS_FILE ])
then
echo "Файл с адресами не найден"
exit
fi

while read LINE; do
if !([ -d $LINE ])
then
mkdir $LINE
fi

echo "$TARGET_DIR/* to $LINE"
cp -R $TARGET_DIR/* $path
done < $PATHS_FILE

echo "Done."

Отправлено: 17:24, 26-10-2012

 

Странный тип


Сообщения: 813
Благодарности: 73

Профиль | Отправить PM | Цитировать


Цитата ktotut:
cp -R $TARGET_DIR/* $path »
А где определена переменная 'path'?

Цитата ktotut:
if !([ -d $TARGET_DIR ]) »
На мой взгляд, круглые скобки не нужны.

-------
Сколько не думай, а лучше водки ничего не придумаешь.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:54, 26-10-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 2029
Благодарности: 704

Профиль | Отправить PM | Цитировать


ktotut, прошу прощения, но тут у Вас ошибка синтаксиса. Вместо
Цитата ktotut:
f !([ -d $LINE ]) »
должно быть "if [ ! -d $LINE ]".
И еще, если позволите, два вопроса:
1. Учитываете ли Вы, что команда cp -R будет копировать далеко не все файлы? К примеру, не будут копироваться скрытые.
Я бы, на Вашем месте воспользовался бы либо командой rsync (rsync -a -H -A -X --devices --specials -c -v --delete "$TARGET_DIR"/ "$LINE"), либо tar ( cd "$TARGET_DIR"; tar cf - . | (cd "$LINE" && tar xBf -).
2. Сценарий не будет работать правильно, если директория или имя файла содержат спецсимволы. К примеру, пробел. Решить эту проблему можно правильным использованием кавычек и установкой IFS в $"\n".
Правда, файлы с символом перевода строки в имени всё равно не будут правильно обрабатываться, но, согласитесь, такие файлы встречаются редко (могу предложить вариант который будет правильно обрабатывать все файлы с корректными именами, даже содержащие переводы строки в имени, но, честно говоря, не вижу смысла - это не более, чем бесполезное упражнение в использовании команд оболочки, к тому же, его работоспособность далеко не очевидна с первого взгляда).

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:13, 27-10-2012 | #3


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg scr.jpg
(30.6 Kb, 7 просмотров)

К сожалению видимо я много чего не учитываю, однако пока ничего не помогает...
прикладываю скрин с консоли.

сейчас текст скрипта выглядит так:
#!/bin/sh

if [ $# -ne 2 ]
then
echo "Параметры вызова: ([директория], [файл с адресами])"
exit
fi

PATHS_FILE=$2
TARGET_DIR=$1

if !([ -d $TARGET_DIR ])
then
echo "no directory"
exit
fi

if !([ -f $PATHS_FILE ])
then
echo "no file"
exit
fi

while read LINE;
do
if ([ ! -d $LINE ])
then
mkdir $LINE
fi
echo "$TARGET_DIR/* to $LINE"

echo $TARGET_DIR
echo $path

cp -R $TARGET_DIR/* $path
rsync -a -H -A -X --devices --specials -c -v --delete "$TARGET_DIR"/ "$LINE"

done < $PATHS_FILE

echo "Done."

Отправлено: 20:12, 27-10-2012 | #4


Ветеран


Сообщения: 2029
Благодарности: 704

Профиль | Отправить PM | Цитировать


ktotut, запустите, пожалуйста Ваш сценарий командой:
Код: Выделить весь код
bash -x script.sh administator site.txt &> script.log
и добавьте script.log в качестве приложения к Вашему следующему сообщению.

Покажите, если не сложно, результат выполнения "ls -l `which sh`"

Я бы всё-таки рекомендовал Вам заменить в первой строчке #!/bin/sh на #!/bin/bash, сделать файл исполняемым (chmod a+x script.sh) и запускать его непосредственно, а не в виде параметра оболочки - это же неудобно.

P.S. Строчки
Цитата ktotut:
if !([ -d $TARGET_DIR ]) »
и
Цитата ktotut:
if !([ -f $PATHS_FILE ]) »
надо заменить на "if [ ! -d $TARGET_DIR ]" и if [ ! -f $PATHS_FILE ] соответственно. В Вашем случае восклицательный знак является не логическим оператором отрицания, а ссылкой на историю команд bash (если Ваш "sh" действительно ссылка на /bin/bash, а не на какой-нибудь ash или busybox).

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:36, 27-10-2012 | #5


Странный тип


Сообщения: 813
Благодарности: 73

Профиль | Отправить PM | Цитировать


Цитата AMDBulldozer:
Я бы всё-таки рекомендовал Вам заменить в первой строчке #!/bin/sh на #!/bin/bash »
Не видно ничего bash-специфичного, не имеет смысла.

Цитата AMDBulldozer:
должно быть "if [ ! -d $LINE ]" »
Именно так.

Цитата AMDBulldozer:
Учитываете ли Вы, что команда cp -R будет копировать далеко не все файлы? К примеру, не будут копироваться скрытые »
Позвольте не согласиться. Скрытые файлы копируются.

-------
Сколько не думай, а лучше водки ничего не придумаешь.


Отправлено: 21:12, 27-10-2012 | #6


Ветеран


Сообщения: 2029
Благодарности: 704

Профиль | Отправить PM | Цитировать


Цитата Kent:
Позвольте не согласиться. Скрытые файлы копируются. »
Вы возможно не обратили внимание, что команда копирования у автора записана в форме
Цитата ktotut:
cp -R $TARGET_DIR/* $path »
а это значит, что подстановка образца (wildcard) "звездочка" будет осуществляться оболочкой. То есть команда cp будет развернута в "cp dir/file1 dir/file2 dir/file3 ... path". При этом файлов начинающихся с точки в результирующей строке не будет, поскольку они не подпадают под шаблон "*".
Понятно, что автору проще было вообще не ставить последнюю звездочку, а ограничиться указанием директории.

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.


Отправлено: 22:16, 27-10-2012 | #7


Ветеран


Сообщения: 2029
Благодарности: 704

Профиль | Отправить PM | Цитировать


Цитата Kent:
Не видно ничего bash-специфичного, не имеет смысла. »
Тут вопрос в том, что /bin/sh у автора скорее всего символьная ссылка. Причем мы не знаем абсолютно ничего о системе автора и, стало быть, не можем делать предположения о том, какая оболочка там используется в действительности.
Поэтому, даже из соображений портируемости сценария, я всегда предпочитаю указывать реальную оболочку.
На любой настольной Linux-системе bash всегда будет установлен по умолчанию и его явное указание проблем создать не может.
А если, к примеру, сценарий используется на какой-либо встроенной системе, это позволяет сразу выявить причину ошибки, без необходимости долго копаться, прежде чем будет установлено, что оператор "[" не был включен в данную версию busybox.
Кроме того, это позволяет спокойно дорабатывать сценарий, включая в него специфичные для указанной оболочки возможности, не опасаясь того, что на другой машине вместо bash'а будет вызван dash (достаточно распространенная ситуация) и использованный в какой-то момент вместо "[" оператор "[[" будет интерпретирован как ошибка.

-------
Господа! Убедительная просьба не обращаться за консультациями в ЛС. Поверьте, создать ветку в соответствующем разделе форума гораздо эффективнее.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:34, 27-10-2012 | #8


Странный тип


Сообщения: 813
Благодарности: 73

Профиль | Отправить PM | Цитировать


Цитата AMDBulldozer:
подстановка образца (wildcard) "звездочка" будет осуществляться оболочкой »
Вероятно, вы правы. В zsh у меня это работает.

Код: Выделить весь код
kent@lazy /tmp % ls -aR copy*
copy-test:
.  ..  .cptest1  .cptest2

copy-test2:
.  ..
kent@lazy /tmp % cp -R copy-test/* copy-test2
kent@lazy /tmp % ls -aR copy*                
copy-test:
.  ..  .cptest1  .cptest2

copy-test2:
.  ..  .cptest1  .cptest2
kent@lazy /tmp % exec bash
kent@lazy:/tmp> ls -aR copy*
copy-test:
.  ..  .cptest1  .cptest2

copy-test2:
.  ..
kent@lazy:/tmp> cp -R copy-test/* copy-test2
cp: не удалось выполнить stat для «copy-test/*»: Нет такого файла или каталога

-------
Сколько не думай, а лучше водки ничего не придумаешь.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:53, 27-10-2012 | #9


Ветеран


Сообщения: 2029
Благодарности: 704

Профиль | Отправить PM | Цитировать


Цитата Kent:
В zsh у меня это работает. »
Очень интересно. У меня не работает. zsh 4.3.17 Я считаю, что и не должен. На досуге попробую разобраться, как Вам удалось заставить его копировать скрытые файлы.

Отправлено: 01:24, 28-10-2012 | #10



Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » SH скрипт копирования каталога

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Скрипт копирования баз Goodkid Скриптовые языки администрирования Windows 9 29-04-2013 17:14
CMD/BAT - Скрипт копирования по сети Forpost Скриптовые языки администрирования Windows 1 21-06-2010 17:06
Разное - Скрипт резервного копирования dividik Microsoft Windows 2000/XP 10 27-01-2009 12:45
Прочие - Программа (скрипт) удаление из заданного каталога заданных файлов __sa__nya Программное обеспечение Windows 1 20-11-2008 19:02
Скрипт каталога ссылок Links 2 aist1 Вебмастеру 4 06-12-2005 01:26




 
Переход