Jump to content

Recommended Posts

Posted

Существует-ли скрипт-сканер новых файлов? Есть FTP и туда народ потихоньку заливает...

 

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

 

Наверняка кто-то уже писал... Поделитесь, плиз!

Posted
Под какой системой?

Хотя если ссылка символьная... Делается утилитой find, и в cron ее.

man find, смотреть секцию EXAMPLES

find ом я получаю список новых файлов, как мне создать для каждого из них символьную ссылку?

 

Система FreeBSD 5.3

Posted
Под какой системой?

Хотя если ссылка символьная... Делается утилитой find, и в cron ее.

man find, смотреть секцию EXAMPLES

find ом я получаю список новых файлов, как мне создать для каждого из них символьную ссылку?

 

Система FreeBSD 5.3

Подозреваю, что надо туда как-то замешать link, но как...

Posted

в итоге пришел к такой вот строчке:

 

find /var/ftp/pub -type f -newerct '7 days ago' -exec ln -s '{}' /var/ftp/pub/ALL/NEW ';'

 

НО - совсем не понятно откуда она берет дату файла... по крайней мере, с той что выдает ls -la совсем не совпадает... похоже она берет последнее обращение...

Posted (edited)

Вот к примеру поставил 30 days ago, и откуда-то затесались файлы аж 2001 года...

 

30.03.2002  03:15       704 061 440 2000 AD.avi
17.05.2001  21:37       705 908 736 Final Destination.a
12.04.2006  04:29     1 646 230 982 Dead Man.avi
28.01.2006  10:44       521 342 470 Descent.avi
02.04.2006  22:39     1 231 692 590 Dungeons & Dragons
11.01.2002  23:04       698 808 320 Dungeons & Dragons.
10.02.2008  14:35       537 784 548 Dungeons & Dragons
11.02.2008  19:43       733 806 592 Blair Witch 2.avi
11.02.2008  05:39     1 633 955 840 Blair Witch Project
21.02.2008  18:04       734 605 312 Day of Triffids.avi
20.02.2008  21:37       698 873 492 Truman Show.avi
23.02.2008  15:46     1 416 034 304 Langoliers.avi
22.02.2008  01:09       733 634 560 Idiocracy.avi
13.03.2008  23:37     1 357 147 916 8 Mile.avi
14.03.2008  00:05     1 330 681 894 28 Days Later.avi
12.03.2008  01:24       695 371 776 15 Minutes.avi
12.03.2008  02:35     1 464 051 712 Azumi.avi
12.03.2008  01:32       711 361 506 51st State.avi
12.03.2008  01:46       709 320 704 9.5 Weeks.avi
12.03.2008  02:13       693 266 432 Absolute Power.avi
08.03.2008  15:02     1 467 953 152 Assassins.avi
08.03.2008  17:09       734 012 344 Banlieue 13.avi
12.03.2008  04:20       594 649 088 Brother.avi
12.03.2008  03:48     1 509 507 072 Blade Runner.avi
12.03.2008  04:52       730 126 708 Breakfast at Tiffan
12.03.2008  03:45       724 427 264 Cecil B Demented.av
12.03.2008  02:23       734 963 712 Crank.avi
08.03.2008  15:47       729 356 288 Sound of Thunder.av
12.03.2008  03:03       705 013 760 Deep End.avi
08.03.2008  13:10       736 542 720 It's All About Love
12.03.2008  04:16       723 251 200 Le Frere du Guerrie
12.03.2008  03:55     1 171 171 328 NeverEnding Story.a
12.03.2008  04:09     1 216 743 424 Reservoir Dogs.avi
12.03.2008  03:20       715 276 288 Rivieres Pourpres 2
08.03.2008  17:17     1 468 590 080 Serenity.avi
08.03.2008  18:30     1 468 567 552 Smokin Aces.avi
08.03.2008  16:27       728 842 240 Ultraviolet.avi
08.03.2008  15:57     1 368 641 536 V for Vendetta.avi
12.03.2008  02:45       708 411 392 Wag Dog.avi
12.03.2008  01:11       731 504 640 Whole Ten Yards.avi
17.03.2008  04:11       620 752 896 Evil Dead 2 - Dead
17.03.2008  04:15       707 116 544 Evil Dead 3 - Army
17.03.2008  04:20       732 610 560 Beautiful Mind.avi

 

я взял скачал файл к которому не было доступа с 2003 года, время доступа обновилось, но в список он не попал...

Edited by -=DGN=-
Posted
НО - совсем не понятно откуда она берет дату файла... по крайней мере, с той что выдает ls -la совсем не совпадает... похоже она берет последнее обращение...
Дата создания файла, его последней модификации и последнего доступа к нему может быть разной. Вам, скорее всего, нужна дата последней модификации.

Следите за точным значением флагов для команды find в вашей системе, возможно, вам надо не "-newerct" а просто "-newer" (начинаем закачку на FTP - создаем файл, заканчиваем - последняя модификация).

Posted
НО - совсем не понятно откуда она берет дату файла... по крайней мере, с той что выдает ls -la совсем не совпадает... похоже она берет последнее обращение...
Дата создания файла, его последней модификации и последнего доступа к нему может быть разной. Вам, скорее всего, нужна дата последней модификации.

Следите за точным значением флагов для команды find в вашей системе, возможно, вам надо не "-newerct" а просто "-newer" (начинаем закачку на FTP - создаем файл, заканчиваем - последняя модификация).

-newer не принимает агрумент days ago, как я понял, ему надо файл (то есть, он сравнивает время с файлом)

Posted

видимо с этими файлами какой-то глюк, вот как отображается его время создания

 

 Создан:    фев 29 22:31
          Изменен:   мар 30 2002
          Обращение: мар 30 2002

 

то есть в создании не указан год, а указано время... может в этом дело?

Posted
то есть в создании не указан год, а указано время... может в этом дело?
Я бы редположил что год создания совпадает с текущем.

 

Ерунду сказал с -newer (хотя и так можно, предварительно создавая файл-эталон, например каждый раз когда "сканер" запускается, чтоб в следующий раз знать когда последний раз запускали).

 

Флаг который смотрит на дату последней модификации называтеся -mtime, и дается ему integer.

Например, "find -type f -mtime -6 -print" найдет все файлы моложе недели, а "find -type f -mtime +6 -print" найдет файлы старше недели. Писать 6 а не 7 надо потому что там округление количества дней своеобразно, man об этом предупреждает.

 

Приведенные примеры у меня работают, но у меня не BSD. Смотрите вывод команды man find, синтакс может совпадать а может отличатся в неких деталях.

Posted

Кстати, если символьные ссылки по абсолютному пути создавать, а демон FTP сидит в клетке chroot, то ссылки дле него будут битыми.

Posted
Кстати, если символьные ссылки по абсолютному пути создавать, а демон FTP сидит в клетке chroot, то ссылки дле него будут битыми.

И как это фиксить?

Posted
Кстати, если символьные ссылки по абсолютному пути создавать, а демон FTP сидит в клетке chroot, то ссылки дле него будут битыми.

И как это фиксить?

Сначала надо проверить, действительно ли это так.

 

А если грабли обнаружатся, то можно:

1) Выпустить из клетки демона FTP.

2) Запускать find в той-же клетке.

3) Делать ссылки относительными.

 

Вариант 1 самый простой но он-же самый стремный.

Вариант 3 самый чистый. Способов приходит в голову несколько, но кажется проще всего будет воспользоватся утилитой symlinks, она достаточно базовая и в BSD тоже должна быть. Читайте man, там есть специальная опция для превращения абсолютных ссылок в относительные. Ее можно запускать после find'а на всей директории где ссылки лежат (совершенно не селективна, не дает оперировать над отдельными ссылками).

 

 

Posted
Кстати, если символьные ссылки по абсолютному пути создавать, а демон FTP сидит в клетке chroot, то ссылки дле него будут битыми.

И как это фиксить?

Сначала надо проверить, действительно ли это так.

 

А если грабли обнаружатся, то можно:

1) Выпустить из клетки демона FTP.

2) Запускать find в той-же клетке.

3) Делать ссылки относительными.

 

Вариант 1 самый простой но он-же самый стремный.

Вариант 3 самый чистый. Способов приходит в голову несколько, но кажется проще всего будет воспользоватся утилитой symlinks, она достаточно базовая и в BSD тоже должна быть. Читайте man, там есть специальная опция для превращения абсолютных ссылок в относительные. Ее можно запускать после find'а на всей директории где ссылки лежат (совершенно не селективна, не дает оперировать над отдельными ссылками).

Ссылки из FTP действительно не открываются... В SAMBA все ОК.

 

Как узнать в клетке-ли демон?

 

Как запустить в той-же клетке find?

 

Posted
Как узнать в клетке-ли демон?
Посмотрите в его конфиг. Ключевое слово - chroot.

 

Как запустить в той-же клетке find?
man chroot

 

Хотя я бы рекомендовал относительные ссылки.

 

 

Posted (edited)
Как узнать в клетке-ли демон?
Посмотрите в его конфиг. Ключевое слово - chroot.

 

Как запустить в той-же клетке find?
man chroot

 

Хотя я бы рекомендовал относительные ссылки.

symlinks -c как ни странно ничего с сылками не сделал... или его надо тоже через chroot пускать?

 

find в клетке не пускается, так как его там нету. а если положить, то нет его библиотек /libexec

 

P.S. Оказывается, symlinks не конвертит ссылки между разными дисками... Однако если вручную поправить на относительные - работает! Как-бы её заставить это сделать??

Edited by -=DGN=-
Posted
symlinks -c как ни странно ничего с сылками не сделал... или его надо тоже через chroot пускать?
Нет, chroot тут совсем никаким боком.

Как (и откуда) вы symlinks запускаете?

А диагностику оно никакую не дает? Может быть, у вас ссылка и файл на разных файловых системах находятся?

 

find в клетке не пускается, так как его там нету. а если положить, то нет его библиотек /libexec
Да, я погорячился. Так просто не получится.

 

Posted
symlinks -c как ни странно ничего с сылками не сделал... или его надо тоже через chroot пускать?
Нет, chroot тут совсем никаким боком.

Как (и откуда) вы symlinks запускаете?

А диагностику оно никакую не дает? Может быть, у вас ссылка и файл на разных файловых системах находятся?

 

find в клетке не пускается, так как его там нету. а если положить, то нет его библиотек /libexec
Да, я погорячился. Так просто не получится.

На разных! Каталог PUB подмонтирован кучей дисков... Я вручную переименовал кроссдисковую ссылку - все работает! Чем это сделать автоматически??

Posted
На разных! Каталог PUB подмонтирован кучей дисков...
См. секцию BUGS в man symlinks

 

Я вручную переименовал кроссдисковую ссылку - все работает! Чем это сделать автоматически??
Переименовывать уже созданные ссылки неэффективно. Надо преобразовывать абсолютный path в относительный на лету, в кажтом цикле exec команды find.

Не знаю как bash (или какой там у вас шелл), но это умеет делать perl 5, с помощью библиотеки File::Spec. Как именно установить библиотеку в BSD (пакетом? через cpan?), я ответить затрудняюсь, но не думаю что с этим возникнут сложности, а собственно perl в системе скорее всего уже есть.

Очевидно, нужна команда (скрипт или inline) которой можно будет скармливать в качестве аргументов абсолютный путь и базовую директорию (ту где ссылки лежать будут), чтоб эта команда печатала относительный путь на стандартный вывод, подхватывать его оттуда и скармливать команде ln.

Команду или скрипт я, с вашего разрешения, за вас писать все-таки не буду. Не обижайтесь ради бога, это принципиальный вопрос.

 

Posted

В итоге получилось вот такое безобразие... при всей кривизне, оно работает. Может скриптом, оно и правильнее, но я все-же админ, а не программист.

 

Засада конечно, что у symlinks BAG, а reclinker работает только переносом из одной диерктории в другую...

 

rm /var/ftp/pub/ALL/Фильмы\ за\ неделю/*

rm /var/ftp/tmp/*
find /var/ftp/pub/ALL/Фильмы_иностранные -type f -newermt '7 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p ../Фильмы_иностранные /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за неделю"

rm /var/ftp/pub/tmp/*
find /var/ftp/pub/ALL/Детские/Фильмы -type f -newermt '7 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p ../Детские/Фильмы /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за неделю"

rm /var/ftp/tmp/*
find /var/ftp/pub/ALL/Детские/Мультфильмы -type f -newermt '7 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p ../Детские/Мультфильмы /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за неделю"

rm /var/ftp/tmp/*
find /var/ftp/pub/ALL/Фильмы/HD -type f -newermt '7 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p ../Фильмы/HD /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за неделю"

rm /var/ftp/tmp/*
find /var/ftp/pub/ALL/Фильмы/Фильмы\ Русские -type f -newermt '7 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p "../Фильмы/Фильмы Русские" /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за неделю"

rm /var/ftp/pub/ALL/Фильмы\ за\ месяц/*

rm /var/ftp/tmp/*
find /var/ftp/pub/ALL/Фильмы_иностранные -type f -newermt '30 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p ../Фильмы_иностранные /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за месяц"

rm /var/ftp/pub/tmp/*
find /var/ftp/pub/ALL/Детские/Фильмы -type f -newermt '30 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p ../Детские/Фильмы /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за месяц"

rm /var/ftp/tmp/*
find /var/ftp/pub/ALL/Детские/Мультфильмы -type f -newermt '30 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p ../Детские/Мультфильмы /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за месяц"

rm /var/ftp/tmp/*
find /var/ftp/pub/ALL/Фильмы/HD -type f -newermt '30 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p ../Фильмы/HD /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за месяц"

rm /var/ftp/tmp/*
find /var/ftp/pub/ALL/Фильмы/Фильмы\ Русские -type f -newermt '30 days ago' -exec ln -s '{}' /var/ftp/tmp ';'
reclinker -l -r -p "../Фильмы/Фильмы Русские" /var/ftp/tmp "/var/ftp/pub/ALL/Фильмы за месяц"

 

Раз в день такое пускается, юзера должны быть довольны... ;-)

Posted
а еще правильнее - прикрутить вебморду к каталогу фильмов... И забыть про русские символы на фтп....

Это планируется сделать в ближайшее время, но существует довольно много народу которому удобнее через майкрософт нетворк... Да и на сеть нагрузка равномернее чем когда качают...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.