Здравствуйте,
Помогите написать скрипт для перемещения файлов из директории в другую директорию.
А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне нужно перемещать в другую папку. И если файл перемещен, то сделать insert в Oracle (имя файла и путь к нему). Скрипт желателен на shell, perl или С/C++
Спасибо.
>Здравствуйте,
>Помогите написать скрипт для перемещения файлов из директории в другую директорию.
>А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне
>нужно перемещать в другую папку. И если файл перемещен, то сделать
>insert в Oracle (имя файла и путь к нему). Скрипт желателен
>на shell, perl или С/C++
>Спасибо.В никсах принято называть каталогами, а не папками :)
Вот к примеру написал по памяти не вылезая из броузера:
#!/bin/bash
#каталог куда из инета копируются файлы
SOURCE_PATH=/path/from/www
#каталог куда перемещаем
TARGET_PATH=/path/to/bunker# Для всех файлов что есть в каталоге
for i in $SOURCE_PATH/*
do
FILENAME=`basename $i`# копируем куда надо, если не скопируется то в stdout будет соответсвующий спам
mv $i $TARGET_PATH/$FILENAME# если скопировали удачно, то
if [ $? == 0 ] then# то пишим в базу
RES=`sqlplus login/password@database <<EOF
insert into megatable (name, path) values ('$FILENAME', '$TARGET_PATH');
exit
EOF`# отписываемся о результате инсерта в stdout
[ echo $RES | grep '1 row created' ] || echo "Error!" && echo "OK"fi
doneПроблемы:
неизвестно когда запускается скрипт, т.е. если в момент копирования из инета будет запущен скрипт, то будет конфликт - скрипт переместит файл в который производится запись - будет злой облом. Кто-то должен разрулить эту ситуацию т.е. должен быть признак что файл полностью скопирован из инета.
>>Здравствуйте,
>>Помогите написать скрипт для перемещения файлов из директории в другую директорию.
>>А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне
>>нужно перемещать в другую папку. И если файл перемещен, то сделать
>>insert в Oracle (имя файла и путь к нему). Скрипт желателен
>>на shell, perl или С/C++
>>Спасибо.>Проблемы:
>неизвестно когда запускается скрипт, т.е. если в момент копирования из инета будет
>запущен скрипт, то будет конфликт - скрипт переместит файл в который
>производится запись - будет злой облом. Кто-то должен разрулить эту ситуацию
>т.е. должен быть признак что файл полностью скопирован из инета.Именно по этой причине я и завел эту тему, т.к.как раз эта проблема меня и интересует.
Есть идеи?
>>>Здравствуйте,
>>>Помогите написать скрипт для перемещения файлов из директории в другую директорию.
>>>А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне
>>>нужно перемещать в другую папку. И если файл перемещен, то сделать
>>>insert в Oracle (имя файла и путь к нему). Скрипт желателен
>>>на shell, perl или С/C++
>>>Спасибо.
>
>>Проблемы:
>>неизвестно когда запускается скрипт, т.е. если в момент копирования из инета будет
>>запущен скрипт, то будет конфликт - скрипт переместит файл в который
>>производится запись - будет злой облом. Кто-то должен разрулить эту ситуацию
>>т.е. должен быть признак что файл полностью скопирован из инета.
>
>Именно по этой причине я и завел эту тему, т.к.как раз эта
>проблема меня и интересует.
>Есть идеи?
программа копирующая файл из инета должна создавать лок файл, во время работы, и удалять его по завершению, скрипт его проверяет.
делов то.
>программа копирующая файл из инета должна создавать лок файл, во время работы,
>и удалять его по завершению, скрипт его проверяет.
>делов то.нафик)) пусть вместо лока по завершению копирования сама переместит куда надо файл и пропишет в базу инсерт :)
Встречный вопрос - как и что за прога копирует из нета? это скрипт? ее можно изменить или нет? Зная это можно генерить идеи близкие к жизни :)
>>программа копирующая файл из инета должна создавать лок файл, во время работы,
>>и удалять его по завершению, скрипт его проверяет.
>>делов то.
>
>нафик)) пусть вместо лока по завершению копирования сама переместит куда надо файл
>и пропишет в базу инсерт :)
>
>Встречный вопрос - как и что за прога копирует из нета? это
>скрипт? ее можно изменить или нет? Зная это можно генерить идеи
>близкие к жизни :)
знаю только, что файлы заливает система стороней организации.
можно-ли вносить изменения в их систему - не знаю (
>>>программа копирующая файл из инета должна создавать лок файл, во время работы,
>>>и удалять его по завершению, скрипт его проверяет.
>>>делов то.
>>
>>нафик)) пусть вместо лока по завершению копирования сама переместит куда надо файл
>>и пропишет в базу инсерт :)
>>
>>Встречный вопрос - как и что за прога копирует из нета? это
>>скрипт? ее можно изменить или нет? Зная это можно генерить идеи
>>близкие к жизни :)
>знаю только, что файлы заливает система стороней организации.
>можно-ли вносить изменения в их систему - не знаю (А система эта физически где расположена? на твоем сервере или где то в инете?(может она вам по какому стандартному протоколу файлы сливает?)
если так надо знать имя юзера под которым она работает, и запускать твой скрипт только тогда когда этого юзера нету в системе.
>А система эта физически где расположена? на твоем сервере или где
>то в инете?(может она вам по какому стандартному протоколу файлы сливает?)
>
>если так надо знать имя юзера под которым она работает, и запускать
>твой скрипт только тогда когда этого юзера нету в системе.она расположена где-то в инете
файлы копируются по scp.
А не может случиться так, что на момент проверки пользователя скриптом - его не было, но после начала копирования он (пользователь) вдруг появляется и начинает дополнительно заливать файлы?
хотя тут мне сообщили что shell не даст скопировать недокаченный файл, типа он сам его локирует. Это действительно так?
>хотя тут мне сообщили что shell не даст скопировать недокаченный файл, типа
>он сам его локирует. Это действительно так?Нет конечно
1. линух(никсы) не винда, и не имеет moderate access к файлам.
2. shell ваще файлы не копирует, копирует утилита cp (в вашем случае scp).
3. файл удалить не вопрос т.к. при этом стирается запись из каталога (каталог это тоже файл), писатель и дальше будет писать т.к. дескриптор в процессе останется открытым и после окончания записи и закрытия дескриптора файл исчезнет уже физически (т.к. количество ссылок на inode файловой системы станет = 0.В вашем случае видимо надо в скрипте анализировать вывод утилиты lsof перед перемещением и перемещать только файлы для которых нет открытых дескрипторв.
Еще вариант - просто перемещаем файлы. Невзирая на то пишут их или нет :)
Что прозойдет? для полностью скопированного файла все ок.
для неполностью скопированного файла - mv (или rename) перенесет файл в другой каталог при этом запись в него будет продолжаться (уже в новом каталоге!), т.к. дескриптор открыт. Останется только решить критично ли то что может сложиться ситуация что после insert в базу копируемого в данный момент файла может случиться абзац в сети и файл недокачается уже по причинам в сети?Вышеописанный фокус с переносом открытого файла в который идет запись работает только если оба каталога находятся в одной файловой системе, на одном диске. Иначе mv (rename) вынуждена будет именно полностью переносить файл, а не перемещать запись из одного каталога в другой.
p.s. ну и эксперимент с scp нужен т.к. не наю я как он себя ведет.. cp вот не ругается=)
уф... =)
прставил эксперимент:
запустил копирование по scp большого файла, и запустил скрипт.
Файл со старого места удалился, и появился урезанным в новом месте, но этот файл продолжал докачиваться в уже новое место. ))
>прставил эксперимент:
>запустил копирование по scp большого файла, и запустил скрипт.
>Файл со старого места удалился, и появился урезанным в новом месте, но
>этот файл продолжал докачиваться в уже новое место. ))так тебе ж сказали что это будет, если мв будет в пределах одного физического носителя. что далеко не всегда бывает.(решение какое то не особо маштабируемое получатеся)
>(решение какое то не особо маштабируемое получатеся)Плохое решение построенное на нюансах((
Следует смотреть в сторону изменения клиента: сам закачал - сам записал в базу. Или хотя бы сменил имя файлу после закачки (это можно будет безболезненно детектить далее).
Если есть возможность клиента изменять..
>>А система эта физически где расположена? на твоем сервере или где
>>то в инете?(может она вам по какому стандартному протоколу файлы сливает?)
>>
>>если так надо знать имя юзера под которым она работает, и запускать
>>твой скрипт только тогда когда этого юзера нету в системе.
>
>она расположена где-то в инете
>файлы копируются по scp.
>А не может случиться так, что на момент проверки пользователя скриптом -
>его не было, но после начала копирования он (пользователь) вдруг появляется
>и начинает дополнительно заливать файлы?верно мыслишь, может! :)
может ему на это время запретить регистрироваться?а на счет того что "оболочка недаст" я что то не уверен. не дело это оболочки.
>>А система эта физически где расположена? на твоем сервере или где
>>то в инете?(может она вам по какому стандартному протоколу файлы сливает?)
>>
>>если так надо знать имя юзера под которым она работает, и запускать
>>твой скрипт только тогда когда этого юзера нету в системе.
>
>она расположена где-то в инете
>файлы копируются по scp.
>А не может случиться так, что на момент проверки пользователя скриптом -
>его не было, но после начала копирования он (пользователь) вдруг появляется
>и начинает дополнительно заливать файлы?я ман посмотрел по scp уж больно у нее набор команд ограничен. лучше бы sftp использовали. тогда и файл блокировки легко бы можно было добавлять и удалять.
а можно перед началом сессии копирования добавить в их программу(если уж не менять scp) заход на ваш сервер и создания блока по ssh и по окончании сессии scp еще раз но уже снятие блока.т.е часть ответственности за правильное копирование перенести на их сторону. а то фигли? они копируют а вас полная каша.
>>Проблемы:
>>неизвестно когда запускается скрипт, т.е. если в момент копирования из инета будет
>>запущен скрипт, то будет конфликт - скрипт переместит файл в который
>>производится запись - будет злой облом. Кто-то должен разрулить эту ситуацию
>>т.е. должен быть признак что файл полностью скопирован из инета.
>
>Именно по этой причине я и завел эту тему, т.к.как раз эта
>проблема меня и интересует.
>Есть идеи?
тут как-то была темка насчет использования lsof/fuser для детекта "недокачаных"
как раз такая же проблема решалась
нашел:
http://www.opennet.me/openforum/vsluhforumID9/6478.html\^P^/
>Вот к примеру написал по памяти не вылезая из броузера:
>#!/bin/bash
>#каталог куда из инета копируются файлы
>SOURCE_PATH=/path/from/www
>#каталог куда перемещаем
>TARGET_PATH=/path/to/bunker
>
># Для всех файлов что есть в каталоге
>for i in $SOURCE_PATH/*
>do
> FILENAME=`basename $i`
>
> # копируем куда надо, если не скопируется то в stdout
>будет соответсвующий спам
> mv $i $TARGET_PATH/$FILENAME
>
> # если скопировали удачно, то
> if [ $? == 0 ] then
>
># то пишим в базу
>RES=`sqlplus login/password@database <<EOF
>insert into megatable (name, path) values ('$FILENAME', '$TARGET_PATH');
>exit
>EOF`
>
># отписываемся о результате инсерта в stdout
>[ echo $RES | grep '1 row created' ] || echo "Error!"
>&& echo "OK"
>
> fi
>doneПодскажите пожалуйста , как можно обработать файлы если они лежат не на первом уровне, а во вложенных папках т.к for i in $SOURCE_PATH/* ищет только на первом уровне.
Командой "find /" я воспользоваться не смог так как он часто выдаёт "ошибку сегментирования" да и после for i in `find $SOURCE_PATH `; команда 'echo $i' выдаёт мне каждое слово по отдельности, а не путь к файлу
>Командой "find /" я воспользоваться не смог так как он
> часто выдаёт "ошибку сегментирования"
офигеть, это что же надо сделать чтобы программа которой уже лет 30 падает?>for i in `find $SOURCE_PATH `; команда 'echo $i' выдаёт мне каждое слово по
>отдельности, а не путь к файлуу мя работает и нормально выдает полные пути:
SOURCE_PATH=/home/me
for i in `find $SOURCE_PATH`
do
echo $i
doneкста, какая система?
давайте скрипт, посмотрим :).
>кста, какая система?
>давайте скрипт, посмотрим :).
#!/bin/bash
SOURCE_PATH=/exports/DVD-9# Для всех файлов что есть в каталоге
for i in `find $SOURCE_PATH`;
do
echo 'файл' $i
FILENAME=`basename $i`
COUNT=` echo $FILENAME| wc -c`
# echo 'количество символов' $COUNT
if [ "$COUNT" -gt 100 ]; then
NewName=${FILENAME:0:90}
echo 'Новое имя' $NewName
fi
done
Задача такая
Найти все файлы в каталоге (рекурсивно) и если длина из имени больше 100 символов обрезать их до 90 символов
Проблема в том что я не могу перебрать все файлы, т.к. for i in `find $SOURCE_PATH`; мне в переменную i заганяет каждое слово в пути к файлу отдельно.ЗЫ Mandriva 2007
>Проблема в том что я не могу перебрать все файлы, т.к.
> for i in `find $SOURCE_PATH`; мне в
>переменную i заганяет каждое слово в пути к файлу отдельно.Используйте следующую конструкцию:
find "$SOURCE_PATH" | while read i; do
#... при обращении к $i берите её в кавычки
doneИли как посоветовали ниже, используйте find -exec.
>`find $SOURCE_PATH `; команда 'echo $i' выдаёт мне каждое слово по
>отдельности, а не путь к файлу
у вас пробелы в именах файлов? попробуйте конструкцию find -exec ...\^P^/