The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Перемещение файлов и update"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Перемещение файлов и update"  
Сообщение от Ищущий ответы on 25-Июн-07, 11:28 
Здравствуйте,
Помогите написать скрипт для перемещения файлов из директории в другую директорию.
А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне нужно перемещать в другую папку. И если файл перемещен, то сделать insert в Oracle (имя файла и путь к нему). Скрипт желателен на shell, perl или С/C++
Спасибо.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Перемещение файлов и update"  
Сообщение от vic (??) on 25-Июн-07, 13:12 
>Здравствуйте,
>Помогите написать скрипт для перемещения файлов из директории в другую директорию.
>А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне
>нужно перемещать в другую папку. И если файл перемещен, то сделать
>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

Проблемы:
неизвестно когда запускается скрипт, т.е. если в момент копирования из инета будет запущен скрипт, то будет конфликт - скрипт переместит файл в который производится запись - будет злой облом. Кто-то должен разрулить эту ситуацию т.е. должен быть признак что файл полностью скопирован из инета.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Перемещение файлов и update"  
Сообщение от Ищущий ответы on 25-Июн-07, 13:26 
>>Здравствуйте,
>>Помогите написать скрипт для перемещения файлов из директории в другую директорию.
>>А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне
>>нужно перемещать в другую папку. И если файл перемещен, то сделать
>>insert в Oracle (имя файла и путь к нему). Скрипт желателен
>>на shell, perl или С/C++
>>Спасибо.

>Проблемы:
>неизвестно когда запускается скрипт, т.е. если в момент копирования из инета будет
>запущен скрипт, то будет конфликт - скрипт переместит файл в который
>производится запись - будет злой облом. Кто-то должен разрулить эту ситуацию
>т.е. должен быть признак что файл полностью скопирован из инета.

Именно по этой причине я и завел эту тему, т.к.как раз эта проблема меня и интересует.
Есть идеи?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Перемещение файлов и update"  
Сообщение от NuINu (??) on 25-Июн-07, 13:40 
>>>Здравствуйте,
>>>Помогите написать скрипт для перемещения файлов из директории в другую директорию.
>>>А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне
>>>нужно перемещать в другую папку. И если файл перемещен, то сделать
>>>insert в Oracle (имя файла и путь к нему). Скрипт желателен
>>>на shell, perl или С/C++
>>>Спасибо.
>
>>Проблемы:
>>неизвестно когда запускается скрипт, т.е. если в момент копирования из инета будет
>>запущен скрипт, то будет конфликт - скрипт переместит файл в который
>>производится запись - будет злой облом. Кто-то должен разрулить эту ситуацию
>>т.е. должен быть признак что файл полностью скопирован из инета.
>
>Именно по этой причине я и завел эту тему, т.к.как раз эта
>проблема меня и интересует.
>Есть идеи?
программа копирующая файл из инета должна создавать лок файл, во время работы, и удалять его по завершению, скрипт его проверяет.
делов то.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Перемещение файлов и update"  
Сообщение от vic (??) on 25-Июн-07, 13:55 
>программа копирующая файл из инета должна создавать лок файл, во время работы,
>и удалять его по завершению, скрипт его проверяет.
>делов то.

нафик)) пусть вместо лока по завершению копирования сама переместит куда надо файл и пропишет в базу инсерт :)

Встречный вопрос - как и что за прога копирует из нета? это скрипт? ее можно изменить или нет? Зная это можно генерить идеи близкие к жизни :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Перемещение файлов и update"  
Сообщение от Ищущий ответы on 25-Июн-07, 14:39 
>>программа копирующая файл из инета должна создавать лок файл, во время работы,
>>и удалять его по завершению, скрипт его проверяет.
>>делов то.
>
>нафик)) пусть вместо лока по завершению копирования сама переместит куда надо файл
>и пропишет в базу инсерт :)
>
>Встречный вопрос - как и что за прога копирует из нета? это
>скрипт? ее можно изменить или нет? Зная это можно генерить идеи
>близкие к жизни :)
знаю только, что файлы заливает система стороней организации.
можно-ли вносить изменения в их систему  - не знаю (
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Перемещение файлов и update"  
Сообщение от NuINu (??) on 25-Июн-07, 14:51 
>>>программа копирующая файл из инета должна создавать лок файл, во время работы,
>>>и удалять его по завершению, скрипт его проверяет.
>>>делов то.
>>
>>нафик)) пусть вместо лока по завершению копирования сама переместит куда надо файл
>>и пропишет в базу инсерт :)
>>
>>Встречный вопрос - как и что за прога копирует из нета? это
>>скрипт? ее можно изменить или нет? Зная это можно генерить идеи
>>близкие к жизни :)
>знаю только, что файлы заливает система стороней организации.
>можно-ли вносить изменения в их систему  - не знаю (

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Перемещение файлов и update"  
Сообщение от Ищущий ответы on 25-Июн-07, 15:18 
>А система эта физически где расположена? на твоем сервере или где  
>то в инете?(может она вам по какому стандартному протоколу файлы сливает?)
>
>если так надо знать имя юзера под которым она работает, и запускать
>твой скрипт только тогда когда этого юзера нету в системе.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Перемещение файлов и update"  
Сообщение от Ищущий ответы on 25-Июн-07, 15:24 
хотя тут мне сообщили что shell не даст скопировать недокаченный файл, типа он сам его локирует. Это действительно так?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Перемещение файлов и update"  
Сообщение от vic (??) on 25-Июн-07, 16:08 
>хотя тут мне сообщили что shell не даст скопировать недокаченный файл, типа
>он сам его локирует. Это действительно так?

Нет конечно
1. линух(никсы) не винда, и не имеет moderate access к файлам.
2. shell ваще файлы не копирует, копирует утилита cp (в вашем случае scp).
3. файл удалить не вопрос т.к. при этом стирается запись из каталога (каталог это тоже файл), писатель и дальше будет писать т.к. дескриптор в процессе останется открытым и после окончания записи и закрытия дескриптора файл исчезнет уже физически (т.к. количество ссылок на inode файловой системы станет = 0.

В вашем случае видимо надо в скрипте анализировать вывод утилиты lsof перед перемещением и перемещать только файлы для которых нет открытых дескрипторв.

Еще вариант - просто перемещаем файлы. Невзирая на то пишут их или нет :)
Что прозойдет? для полностью скопированного файла все ок.
для неполностью скопированного файла - mv (или rename) перенесет файл в другой каталог при этом запись в него будет продолжаться (уже в новом каталоге!), т.к. дескриптор открыт. Останется только решить критично ли то что может сложиться ситуация что после insert в базу копируемого в данный момент файла может случиться абзац в сети и файл недокачается уже по причинам в сети?

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

p.s. ну и эксперимент с scp нужен т.к. не наю я как он себя ведет.. cp вот не ругается=)

уф... =)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "Перемещение файлов и update"  
Сообщение от Ищущий ответы on 25-Июн-07, 16:41 
прставил эксперимент:
запустил копирование по scp большого файла, и запустил скрипт.
Файл со старого места удалился, и появился урезанным в новом месте, но этот файл продолжал докачиваться в уже новое место. ))


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "Перемещение файлов и update"  
Сообщение от NuINu (??) on 25-Июн-07, 17:19 
>прставил эксперимент:
>запустил копирование по scp большого файла, и запустил скрипт.
>Файл со старого места удалился, и появился урезанным в новом месте, но
>этот файл продолжал докачиваться в уже новое место. ))

так тебе ж сказали что это будет, если мв будет в пределах одного физического носителя. что далеко не всегда бывает.(решение какое то не особо маштабируемое получатеся)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "Перемещение файлов и update"  
Сообщение от vic (??) on 25-Июн-07, 17:32 
>(решение какое то не особо маштабируемое получатеся)

Плохое решение построенное на нюансах((

Следует смотреть в сторону изменения клиента: сам закачал - сам записал в базу. Или хотя бы сменил имя файлу после закачки (это можно будет безболезненно детектить далее).
Если есть возможность клиента изменять..

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Перемещение файлов и update"  
Сообщение от NuINu (??) on 25-Июн-07, 15:38 
>>А система эта физически где расположена? на твоем сервере или где  
>>то в инете?(может она вам по какому стандартному протоколу файлы сливает?)
>>
>>если так надо знать имя юзера под которым она работает, и запускать
>>твой скрипт только тогда когда этого юзера нету в системе.
>
>она расположена где-то в инете
>файлы копируются по scp.
>А не может случиться так, что на момент проверки пользователя скриптом -
>его не было, но после начала копирования он (пользователь) вдруг появляется
>и начинает дополнительно заливать файлы?

верно мыслишь, может! :)
может ему на это время запретить регистрироваться?

а на счет того что "оболочка недаст" я что то не уверен. не дело это оболочки.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Перемещение файлов и update"  
Сообщение от NuINu (??) on 25-Июн-07, 15:51 
>>А система эта физически где расположена? на твоем сервере или где  
>>то в инете?(может она вам по какому стандартному протоколу файлы сливает?)
>>
>>если так надо знать имя юзера под которым она работает, и запускать
>>твой скрипт только тогда когда этого юзера нету в системе.
>
>она расположена где-то в инете
>файлы копируются по scp.
>А не может случиться так, что на момент проверки пользователя скриптом -
>его не было, но после начала копирования он (пользователь) вдруг появляется
>и начинает дополнительно заливать файлы?

я ман посмотрел по scp уж больно у нее набор команд ограничен. лучше бы sftp использовали. тогда и файл блокировки легко бы можно было добавлять и удалять.
а можно перед началом сессии копирования добавить в их программу(если уж не менять scp) заход на ваш сервер и создания блока по ssh и по окончании сессии scp еще раз но уже снятие блока.

т.е часть ответственности за правильное копирование перенести на их сторону. а то фигли? они копируют а вас полная каша.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

16. "Перемещение файлов и update"  
Сообщение от perece on 26-Июн-07, 16:43 
>>Проблемы:
>>неизвестно когда запускается скрипт, т.е. если в момент копирования из инета будет
>>запущен скрипт, то будет конфликт - скрипт переместит файл в который
>>производится запись - будет злой облом. Кто-то должен разрулить эту ситуацию
>>т.е. должен быть признак что файл полностью скопирован из инета.
>
>Именно по этой причине я и завел эту тему, т.к.как раз эта
>проблема меня и интересует.
>Есть идеи?
тут как-то была темка насчет использования lsof/fuser для детекта "недокачаных"
как раз такая же проблема решалась
нашел:
https://www.opennet.ru/openforum/vsluhforumID9/6478.html

\^P^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "Перемещение файлов и update"  
Сообщение от rad87 email(ok) on 26-Июн-07, 14:34 
>Вот к примеру написал по памяти не вылезая из броузера:
>#!/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' выдаёт мне каждое слово по отдельности, а не путь к файлу

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

17. "Перемещение файлов и update"  
Сообщение от vic (??) on 26-Июн-07, 20:05 
>Командой "find /"  я воспользоваться не  смог так как он
> часто выдаёт "ошибку сегментирования"
офигеть, это что же надо сделать чтобы программа которой уже лет 30 падает?

>for i in `find $SOURCE_PATH `; команда 'echo $i' выдаёт мне каждое слово по
>отдельности, а не путь к файлу

у мя работает и нормально выдает полные пути:
SOURCE_PATH=/home/me
for i in `find $SOURCE_PATH`
do
  echo $i
done

кста, какая система?
давайте скрипт, посмотрим :).


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

19. "Перемещение файлов и update"  
Сообщение от rad87 email(ok) on 27-Июн-07, 11:07 
>кста, какая система?
>давайте скрипт, посмотрим :).


#!/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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

20. "Перемещение файлов и update"  
Сообщение от jd (??) on 28-Июн-07, 02:03 
>Проблема в том что я не могу перебрать все  файлы, т.к.
>  for i in `find $SOURCE_PATH`;  мне в  
>переменную i  заганяет каждое слово в пути к файлу отдельно.

Используйте следующую конструкцию:

find "$SOURCE_PATH" | while read i; do
  #... при обращении к $i берите её в кавычки
done

Или как посоветовали ниже, используйте find -exec.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

18. "Перемещение файлов и update"  
Сообщение от perece on 26-Июн-07, 20:18 
>`find $SOURCE_PATH `; команда 'echo $i' выдаёт мне каждое слово по
>отдельности, а не путь к файлу
у вас пробелы в именах файлов? попробуйте конструкцию find -exec ...

\^P^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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