|
Компьютерный форум OSzone.net » Linux и FreeBSD » Программирование в *nix » SH скрипт копирования каталога |
|
|
SH скрипт копирования каталога
|
Новый участник Сообщения: 9 |
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 21:54, 26-10-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2029
|
Профиль | Отправить PM | Цитировать ktotut, прошу прощения, но тут у Вас ошибка синтаксиса. Вместо
Цитата ktotut:
И еще, если позволите, два вопроса: 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
|
Профиль | Отправить PM | Цитировать К сожалению видимо я много чего не учитываю, однако пока ничего не помогает...
прикладываю скрин с консоли. сейчас текст скрипта выглядит так: #!/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
|
Профиль | Отправить PM | Цитировать ktotut, запустите, пожалуйста Ваш сценарий командой:
и добавьте script.log в качестве приложения к Вашему следующему сообщению.
Покажите, если не сложно, результат выполнения "ls -l `which sh`" Я бы всё-таки рекомендовал Вам заменить в первой строчке #!/bin/sh на #!/bin/bash, сделать файл исполняемым (chmod a+x script.sh) и запускать его непосредственно, а не в виде параметра оболочки - это же неудобно. P.S. Строчки Цитата ktotut:
Цитата ktotut:
|
|||
------- Отправлено: 20:36, 27-10-2012 | #5 |
Странный тип Сообщения: 813
|
Профиль | Отправить PM | Цитировать Цитата AMDBulldozer:
Цитата AMDBulldozer:
Цитата AMDBulldozer:
|
|||
------- Отправлено: 21:12, 27-10-2012 | #6 |
Ветеран Сообщения: 2029
|
Профиль | Отправить PM | Цитировать Цитата Kent:
Цитата ktotut:
Понятно, что автору проще было вообще не ставить последнюю звездочку, а ограничиться указанием директории. |
||
------- Отправлено: 22:16, 27-10-2012 | #7 |
Ветеран Сообщения: 2029
|
Профиль | Отправить PM | Цитировать Цитата Kent:
Поэтому, даже из соображений портируемости сценария, я всегда предпочитаю указывать реальную оболочку. На любой настольной Linux-системе bash всегда будет установлен по умолчанию и его явное указание проблем создать не может. А если, к примеру, сценарий используется на какой-либо встроенной системе, это позволяет сразу выявить причину ошибки, без необходимости долго копаться, прежде чем будет установлено, что оператор "[" не был включен в данную версию busybox. Кроме того, это позволяет спокойно дорабатывать сценарий, включая в него специфичные для указанной оболочки возможности, не опасаясь того, что на другой машине вместо bash'а будет вызван dash (достаточно распространенная ситуация) и использованный в какой-то момент вместо "[" оператор "[[" будет интерпретирован как ошибка. |
|
------- Отправлено: 22:34, 27-10-2012 | #8 |
Странный тип Сообщения: 813
|
Профиль | Отправить PM | Цитировать Цитата AMDBulldozer:
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
|
Профиль | Отправить PM | Цитировать Цитата Kent:
|
|
Отправлено: 01:24, 28-10-2012 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|