The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Перемещение файлов и update, !*! Ищущий ответы, 25-Июн-07, 11:28  [смотреть все]
Здравствуйте,
Помогите написать скрипт для перемещения файлов из директории в другую директорию.
А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне нужно перемещать в другую папку. И если файл перемещен, то сделать insert в Oracle (имя файла и путь к нему). Скрипт желателен на shell, perl или С/C++
Спасибо.
  • Перемещение файлов и update, !*! vic, 13:12 , 25-Июн-07 (1)
    >Здравствуйте,
    >Помогите написать скрипт для перемещения файлов из директории в другую директорию.
    >А конкретно, есть папка куда постоянно копируются файлы из инета. Их мне
    >нужно перемещать в другую папку. И если файл перемещен, то сделать
    >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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

                    уф... =)

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


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

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

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

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

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

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

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

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

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

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

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

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

        \^P^/

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

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

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

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

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


        • Перемещение файлов и update, !*! rad87, 11:07 , 27-Июн-07 (19)
          >кста, какая система?
          >давайте скрипт, посмотрим :).


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

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

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

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

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

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

        \^P^/




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

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