The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Найти все файлы в папке кроме последнего., !*! Kleo, 27-Дек-06, 04:53  [смотреть все]
Добрый.
В кроне ежечасно архивируются файлы в определенной дире, архивируются все.
Но в эту папку постоянно пишется новый файл, заканчивается, начинает писаться другой.
Нужно чтобы при архивации этот текущий рабочий файл не учитывался. Как такое организовать?
Вот строка из крона:
#
#
0       *       *       *       *       find /dir/ -name '*.svl' | xargs gzip
  • Найти все файлы в папке кроме последнего., !*! Gromophon, 08:09 , 27-Дек-06 (1)
    • Найти все файлы в папке кроме последнего., !*! Kleo, 06:59 , 28-Дек-06 (2)
      >может быть грубовато, но как-то так
      >find /dir/ -name '*.svl' > aa | expr 0 \- `cat aa | wc -l` \+ 1 > a1 | head `cat a1` `cat aa` | xargs gzip
      Сильно :)

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

      • Найти все файлы в папке кроме последнего., !*! allez, 07:20 , 28-Дек-06 (3)
        • Найти все файлы в папке кроме последнего., !*! Kleo, 08:31 , 28-Дек-06 (4)
          >В этом вам поможет lsof.
          man lsof
          No manual entry for lsof
          :(
          • Найти все файлы в папке кроме последнего., !*! allez, 09:36 , 28-Дек-06 (5)
            • Найти все файлы в папке кроме последнего., !*! Kleo, 11:32 , 28-Дек-06 (6)
              >А сам-то lsof у вас есть? Попробуйте "lsof --help". Ну, а если
              >нужен мануал, то вот:
              >https://www.opennet.ru/man.shtml?topic=lsof
              >
              >Вообще же вам достаточно и такой конструкции:
              >
              lsof | grep <your_file>
              Если в списке открытых файлов, выдаваемом lsof, найдется указанный вами файл, значит, он

              >как раз занят каким-то процессом. :-)
              Небыло :)
              Сейчас поставил, работает.
              Осталось только привязать его оутпут к инпуту gzip'а :)
              • Найти все файлы в папке кроме последнего., !*! allez, 14:23 , 28-Дек-06 (7)
                • Найти все файлы в папке кроме последнего., !*! Kleo, 16:20 , 28-Дек-06 (8)
                  >Так за чем же дело стало? ;-)
                  find /dir -name "*.svl" | grep 
                  >-v `lsof | grep "/dir" | awk '{print $9}' | uniq`
                  >| xargs gzip
                  Я хотел, правда, оставить это вам в качестве

                  >
                  >домашнего задания, но что-то не в меру добрый я сегодня. :-)
                  >
                  >P. S. Возможно, вам придется изменить номер поля, выводимого awk (возможно, но
                  >не
                  >обязательно). Тут уж смотрите сами.
                  Готовые решения, это конечно хорошо, но я так и не смог "въехать" в эту семантику :))
                  Скрипт не запустился, ругается на параметры грепа.
                  Если не сложно, можно по шагам объяснить процедуру действа? :)
                  • Найти все файлы в папке кроме последнего., !*! allez, 19:15 , 28-Дек-06 (9)
                    • Найти все файлы в папке кроме последнего., !*! Kleo, 01:10 , 29-Дек-06 (10)
                      >Та-ак, в том, что скрипт не запустился, моя вина: не совсем точно
                      >команду составил.
                      >По зрелом размышлении, она должна бы выглядеть так:
                      find /dir -name "*.svl" 
                      >| grep -v `lsof | grep "/dir" | sed 's/  
                      >*/ /g' | awk '{print $NF}' | uniq` | xargs gzip

                      >А сейчас приступим к разбору. И начнем его с последовательности команд,
                      >заключенных в
                      >обратные кавычки:
                      lsof | grep " /dir" | sed 's/  */ /g' 
                      >| awk '{print $NF}' | uniq
                      Происходит тут следующее:

                      >
                      >1. Команда lsof формирует список открытых файлов.
                      >2. Команда grep "/dir" отбирает из этого списка строки, содержащие "/dir".
                      >3. Команда sed 's/  */ /g' заменяет в отобранных строках последовательности
                      >из двух
                      >и более пробелов на один.
                      >4. Команда awk '{print $NF}' выводит на печать только последнее поле в
                      >полученых
                      >строках (в нем как раз и содержится имя файла).
                      >5. Команда uniq удаляет повторяющиеся строки (это на случай, если файл открыт
                      >более чем
                      >одним процессом).
                      >
                      >Итак, мы получили имя открытого файла. Оно передается в качестве аргумента команде
                      >
                      >grep -v для того, чтобы исключить этот файл из вывода команды find
                      >/dir -name "*.svl".
                      >И, наконец, имена остальных файлов через xargs передаются на вход команды gzip.
                      >
                      >
                      >Уф-ф, вроде бы все. Какое, однако, монументальное объяснение получилось. :-)
                      >
                      >P. S. Да, чуть не забыл: не могли бы вы сообщить, какой
                      >ОС пользуетесь и какие именно
                      >сообщения об ошибках вам были выданы (просто скопируйте их и покажите здесь)?

                      ОС - FreeBSD 6.1
                      Сообщения:
                      Usage: grep [OPTION]... PATTERN [FILE]...
                      Try `grep --help' for more information.
                      Прямо так и выводится, /dir я естественно меняю на свою директорию.

                      Выражаю искреннюю благодарность за подробное разжевывание материала :)
                      Сегодня вечером буду пробовать.
                      Удачи в Новом Году! :)

  • Найти все файлы в папке кроме последнего., !*! Medlar, 15:48 , 29-Дек-06 (15)
    • Найти все файлы в папке кроме последнего., !*! Kleo, 16:01 , 29-Дек-06 (16)
      >А говорят, в рунете нет альтруистов :)
      Кто говорит? Враки :))

      Кстати, пока суть да дело, сделал так:
      Добавил к find /dir/ -name '*.' параметр -mmin +3. Т.е. берем только файлы у которых время последней модификации было более трех минут назад. Так как "открытый" файл пишется постоянно, то в принципе должно работать.
      Проверить смогу чуть позже.
      Полностью скрипт теперь выглядит так:
      find /dir -name "*.svl" -mmin +3 | xargs gzip

  • Найти все файлы в папке кроме последнего., !*! YuryD, 16:01 , 29-Дек-06 (17)
    • Найти все файлы в папке кроме последнего., !*! allez, 20:14 , 30-Дек-06 (18)
      • Найти все файлы в папке кроме последнего., !*! Kleo, 04:46 , 10-Янв-07 (19)
        >Кстати, Kleo, весьма разумное решение. Что-то я, увлекшись вашей задачей, за деревьями
        >
        >леса не увидел. :-) Действительно, почему бы не заставить newsyslog трудиться над
        >вашей
        >проблемой? Он как раз для того и предназначен. И тот огород, что
        >мы с вами нагородили,
        >не понадобится (а заодно и те велосипеды, которые тут наизобретались ;-)).

        Насколько я понял из man newsyslog, эта тулза может следить/архивировать только какой то конкретный, именованный файл (auth.log, messages, etc...), исходя из его макс. размера или даты последней модификации.
        В моем же случае, о файлах известно лишь их расширение, да и размер весьма варьируется. Плюс ко всему имя должно оставаться не изменным, единственно меняется расширение на gz (архив тоесть).
        По моему это немного не то. Хотя возможно неправильно истолковал документацию :)




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

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