URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 71196
[ Назад ]

Исходное сообщение
"Найти все файлы в папке кроме последнего."

Отправлено Kleo , 27-Дек-06 04:53 
Добрый.
В кроне ежечасно архивируются файлы в определенной дире, архивируются все.
Но в эту папку постоянно пишется новый файл, заканчивается, начинает писаться другой.
Нужно чтобы при архивации этот текущий рабочий файл не учитывался. Как такое организовать?
Вот строка из крона:
#
#
0       *       *       *       *       find /dir/ -name '*.svl' | xargs gzip

Содержание

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


"Найти все файлы в папке кроме последнего."
Отправлено Kleo , 28-Дек-06 06:59 
>может быть грубовато, но как-то так
>find /dir/ -name '*.svl' > aa | expr 0 \- `cat aa | wc -l` \+ 1 > a1 | head `cat a1` `cat aa` | xargs gzip
Сильно :)

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


"Найти все файлы в папке кроме последнего."
Отправлено allez , 28-Дек-06 07:20 
>А может быть как то можно узнать, что файл занят другим процессом
>и по этому признаку его не трогать??

В этом вам поможет lsof.


"Найти все файлы в папке кроме последнего."
Отправлено Kleo , 28-Дек-06 08:31 
>В этом вам поможет lsof.
man lsof
No manual entry for lsof
:(

"Найти все файлы в папке кроме последнего."
Отправлено allez , 28-Дек-06 09:36 
>>В этом вам поможет lsof.
>man lsof
>No manual entry for lsof
>:(

А сам-то lsof у вас есть? Попробуйте "lsof --help". Ну, а если нужен мануал, то вот:
http://www.opennet.me/man.shtml?topic=lsof

Вообще же вам достаточно и такой конструкции:

lsof | grep <your_file>
Если в списке открытых файлов, выдаваемом lsof, найдется указанный вами файл, значит, он
как раз занят каким-то процессом. :-)

"Найти все файлы в папке кроме последнего."
Отправлено Kleo , 28-Дек-06 11:32 
>А сам-то lsof у вас есть? Попробуйте "lsof --help". Ну, а если
>нужен мануал, то вот:
>http://www.opennet.me/man.shtml?topic=lsof
>
>Вообще же вам достаточно и такой конструкции:
>
lsof | grep <your_file>
Если в списке открытых файлов, выдаваемом lsof, найдется указанный вами файл, значит, он

>как раз занят каким-то процессом. :-)
Небыло :)
Сейчас поставил, работает.
Осталось только привязать его оутпут к инпуту gzip'а :)

"Найти все файлы в папке кроме последнего."
Отправлено allez , 28-Дек-06 14:23 
>Небыло :)
>Сейчас поставил, работает.
>Осталось только привязать его оутпут к инпуту gzip'а :)

Так за чем же дело стало? ;-)

find /dir -name "*.svl" | grep -v `lsof | grep "/dir" | awk '{print $9}' | uniq` | xargs gzip
Я хотел, правда, оставить это вам в качестве
домашнего задания, но что-то не в меру добрый я сегодня. :-)

P. S. Возможно, вам придется изменить номер поля, выводимого awk (возможно, но не
обязательно). Тут уж смотрите сами.


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

>
>домашнего задания, но что-то не в меру добрый я сегодня. :-)
>
>P. S. Возможно, вам придется изменить номер поля, выводимого awk (возможно, но
>не
>обязательно). Тут уж смотрите сами.
Готовые решения, это конечно хорошо, но я так и не смог "въехать" в эту семантику :))
Скрипт не запустился, ругается на параметры грепа.
Если не сложно, можно по шагам объяснить процедуру действа? :)

"Найти все файлы в папке кроме последнего."
Отправлено allez , 28-Дек-06 19:15 
>Скрипт не запустился, ругается на параметры грепа.
>Если не сложно, можно по шагам объяснить процедуру действа? :)

Та-ак, в том, что скрипт не запустился, моя вина: не совсем точно команду составил.
По зрелом размышлении, она должна бы выглядеть так:

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. Да, чуть не забыл: не могли бы вы сообщить, какой ОС пользуетесь и какие именно
сообщения об ошибках вам были выданы (просто скопируйте их и покажите здесь)?


"Найти все файлы в папке кроме последнего."
Отправлено Kleo , 29-Дек-06 01: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 я естественно меняю на свою директорию.

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


"Найти все файлы в папке кроме последнего."
Отправлено allez , 29-Дек-06 06:24 
>ОС - FreeBSD 6.1
>Сообщения:
>Usage: grep [OPTION]... PATTERN [FILE]...
>Try `grep --help' for more information.
>Прямо так и выводится, /dir я естественно меняю на свою директорию.

Хм, я именно на FreeBSD 6.1 и обкатывал эту команду.
Погонял ее еще малость и остановился на такой конструкции:

find /dir -name "*.svl" | grep -v "`lsof | grep "/dir" | sed 's/  */ /g' | awk '{print $NF}' | sort -u`" | xargs gzip
Проверил несколько раз - работает. Изменения: заключил в кавычки выражение-аргумент для
команды grep -v и заменил uniq на sort -u.

>Выражаю искреннюю благодарность за подробное разжевывание материала :)
Да всегда пожалуйста. :-)

>Удачи в Новом Году! :)
И вам того же.


"Найти все файлы в папке кроме последнего."
Отправлено Kleo , 29-Дек-06 10:47 
>Хм, я именно на FreeBSD 6.1 и обкатывал эту команду.
>Погонял ее еще малость и остановился на такой конструкции:
find /dir -name 
>"*.svl" | grep -v "`lsof | grep "/dir" | sed 's/
> */ /g' | awk '{print $NF}' | sort -u`" |
>xargs gzip
Проверил несколько раз - работает. Изменения: заключил в кавычки

>выражение-аргумент для
>команды grep -v и заменил uniq на sort -u.

При попытке выполнить, пишет:
NF: Undefined variable.  
:(
Пробовал и с открытым файлом в дире и со всеми закрытыми.


"Найти все файлы в папке кроме последнего."
Отправлено allez , 29-Дек-06 12:52 
>При попытке выполнить, пишет:
>NF: Undefined variable.
>:(
>Пробовал и с открытым файлом в дире и со всеми закрытыми.


Это уже awk ругается. Нич-чего не понимаю...
Покажите, пожалуйста, ваш скрипт полностью. Будем посмотреть, где там собака порылась.


"Найти все файлы в папке кроме последнего."
Отправлено Kleo , 29-Дек-06 13:54 
>Покажите, пожалуйста, ваш скрипт полностью. Будем посмотреть, где там собака порылась.
Скрипт беру ваш, копипастом отсюда, единственное что меняю, так это /dir на свою директорию, все.

"Найти все файлы в папке кроме последнего."
Отправлено Medlar , 29-Дек-06 15:48 
А говорят, в рунете нет альтруистов :)
Добавила в свою "шкатулку знаний" скрипт allez'a.

Сорри за оффтопик и с Новым Годом!


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

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


"Найти все файлы в папке кроме последнего."
Отправлено YuryD , 29-Дек-06 16:01 
>Добрый.

>Нужно чтобы при архивации этот текущий рабочий файл не учитывался. Как такое
>организовать?

newsyslog не устраивает ?


"Найти все файлы в папке кроме последнего."
Отправлено allez , 30-Дек-06 20:14 
>>Нужно чтобы при архивации этот текущий рабочий файл не учитывался. Как такое
>>организовать?
>
> newsyslog не устраивает ?


Кстати, Kleo, весьма разумное решение. Что-то я, увлекшись вашей задачей, за деревьями
леса не увидел. :-) Действительно, почему бы не заставить newsyslog трудиться над вашей
проблемой? Он как раз для того и предназначен. И тот огород, что мы с вами нагородили,
не понадобится (а заодно и те велосипеды, которые тут наизобретались ;-)).


"Найти все файлы в папке кроме последнего."
Отправлено Kleo , 10-Янв-07 04:46 
>Кстати, Kleo, весьма разумное решение. Что-то я, увлекшись вашей задачей, за деревьями
>
>леса не увидел. :-) Действительно, почему бы не заставить newsyslog трудиться над
>вашей
>проблемой? Он как раз для того и предназначен. И тот огород, что
>мы с вами нагородили,
>не понадобится (а заодно и те велосипеды, которые тут наизобретались ;-)).

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


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

Тоды ой :-). Я-то документацию на него уже давным-давно не читал: однажды настроил и
теперь по большей части пользуюсь отлаженными конфигами либо целыми клонированными
системами.

Ну что же, значит, придется продолжать развитие собственного решения.