-=DGN=- Posted March 19, 2008 Posted March 19, 2008 Существует-ли скрипт-сканер новых файлов? Есть FTP и туда народ потихоньку заливает... Хочу скрипт, чтоб оббегал директориии FTP, и на все файлы новее (месяца-недели) создавал-бы символьную ссылку в заданный каталог. Наверняка кто-то уже писал... Поделитесь, плиз! Вставить ник Quote
lugoblin Posted March 19, 2008 Posted March 19, 2008 Под какой системой? Хотя если ссылка символьная... Делается утилитой find, и в cron ее. man find, смотреть секцию EXAMPLES Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 Под какой системой?Хотя если ссылка символьная... Делается утилитой find, и в cron ее. man find, смотреть секцию EXAMPLES find ом я получаю список новых файлов, как мне создать для каждого из них символьную ссылку? Система FreeBSD 5.3 Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 Под какой системой?Хотя если ссылка символьная... Делается утилитой find, и в cron ее. man find, смотреть секцию EXAMPLES find ом я получаю список новых файлов, как мне создать для каждого из них символьную ссылку? Система FreeBSD 5.3 Подозреваю, что надо туда как-то замешать link, но как... Вставить ник Quote
m_medved Posted March 19, 2008 Posted March 19, 2008 У find есть -exec Наверное что-то вроде find там-парам -exec ln -s {} /Novoe/ \; Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 в итоге пришел к такой вот строчке: find /var/ftp/pub -type f -newerct '7 days ago' -exec ln -s '{}' /var/ftp/pub/ALL/NEW ';' НО - совсем не понятно откуда она берет дату файла... по крайней мере, с той что выдает ls -la совсем не совпадает... похоже она берет последнее обращение... Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 (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 March 19, 2008 by -=DGN=- Вставить ник Quote
lugoblin Posted March 19, 2008 Posted March 19, 2008 НО - совсем не понятно откуда она берет дату файла... по крайней мере, с той что выдает ls -la совсем не совпадает... похоже она берет последнее обращение...Дата создания файла, его последней модификации и последнего доступа к нему может быть разной. Вам, скорее всего, нужна дата последней модификации.Следите за точным значением флагов для команды find в вашей системе, возможно, вам надо не "-newerct" а просто "-newer" (начинаем закачку на FTP - создаем файл, заканчиваем - последняя модификация). Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 НО - совсем не понятно откуда она берет дату файла... по крайней мере, с той что выдает ls -la совсем не совпадает... похоже она берет последнее обращение...Дата создания файла, его последней модификации и последнего доступа к нему может быть разной. Вам, скорее всего, нужна дата последней модификации.Следите за точным значением флагов для команды find в вашей системе, возможно, вам надо не "-newerct" а просто "-newer" (начинаем закачку на FTP - создаем файл, заканчиваем - последняя модификация). -newer не принимает агрумент days ago, как я понял, ему надо файл (то есть, он сравнивает время с файлом) Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 видимо с этими файлами какой-то глюк, вот как отображается его время создания Создан: фев 29 22:31 Изменен: мар 30 2002 Обращение: мар 30 2002 то есть в создании не указан год, а указано время... может в этом дело? Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 правильная опция оказалась -newermt Вставить ник Quote
lugoblin Posted March 19, 2008 Posted March 19, 2008 то есть в создании не указан год, а указано время... может в этом дело?Я бы редположил что год создания совпадает с текущем. Ерунду сказал с -newer (хотя и так можно, предварительно создавая файл-эталон, например каждый раз когда "сканер" запускается, чтоб в следующий раз знать когда последний раз запускали). Флаг который смотрит на дату последней модификации называтеся -mtime, и дается ему integer. Например, "find -type f -mtime -6 -print" найдет все файлы моложе недели, а "find -type f -mtime +6 -print" найдет файлы старше недели. Писать 6 а не 7 надо потому что там округление количества дней своеобразно, man об этом предупреждает. Приведенные примеры у меня работают, но у меня не BSD. Смотрите вывод команды man find, синтакс может совпадать а может отличатся в неких деталях. Вставить ник Quote
lugoblin Posted March 19, 2008 Posted March 19, 2008 Кстати, если символьные ссылки по абсолютному пути создавать, а демон FTP сидит в клетке chroot, то ссылки дле него будут битыми. Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 Кстати, если символьные ссылки по абсолютному пути создавать, а демон FTP сидит в клетке chroot, то ссылки дле него будут битыми. И как это фиксить? Вставить ник Quote
lugoblin Posted March 19, 2008 Posted March 19, 2008 Кстати, если символьные ссылки по абсолютному пути создавать, а демон FTP сидит в клетке chroot, то ссылки дле него будут битыми. И как это фиксить? Сначала надо проверить, действительно ли это так. А если грабли обнаружатся, то можно: 1) Выпустить из клетки демона FTP. 2) Запускать find в той-же клетке. 3) Делать ссылки относительными. Вариант 1 самый простой но он-же самый стремный. Вариант 3 самый чистый. Способов приходит в голову несколько, но кажется проще всего будет воспользоватся утилитой symlinks, она достаточно базовая и в BSD тоже должна быть. Читайте man, там есть специальная опция для превращения абсолютных ссылок в относительные. Ее можно запускать после find'а на всей директории где ссылки лежат (совершенно не селективна, не дает оперировать над отдельными ссылками). Вставить ник Quote
-=DGN=- Posted March 19, 2008 Author Posted March 19, 2008 Кстати, если символьные ссылки по абсолютному пути создавать, а демон FTP сидит в клетке chroot, то ссылки дле него будут битыми. И как это фиксить? Сначала надо проверить, действительно ли это так. А если грабли обнаружатся, то можно: 1) Выпустить из клетки демона FTP. 2) Запускать find в той-же клетке. 3) Делать ссылки относительными. Вариант 1 самый простой но он-же самый стремный. Вариант 3 самый чистый. Способов приходит в голову несколько, но кажется проще всего будет воспользоватся утилитой symlinks, она достаточно базовая и в BSD тоже должна быть. Читайте man, там есть специальная опция для превращения абсолютных ссылок в относительные. Ее можно запускать после find'а на всей директории где ссылки лежат (совершенно не селективна, не дает оперировать над отдельными ссылками). Ссылки из FTP действительно не открываются... В SAMBA все ОК. Как узнать в клетке-ли демон? Как запустить в той-же клетке find? Вставить ник Quote
lugoblin Posted March 19, 2008 Posted March 19, 2008 Как узнать в клетке-ли демон?Посмотрите в его конфиг. Ключевое слово - chroot. Как запустить в той-же клетке find?man chroot Хотя я бы рекомендовал относительные ссылки. Вставить ник Quote
-=DGN=- Posted March 20, 2008 Author Posted March 20, 2008 (edited) Как узнать в клетке-ли демон?Посмотрите в его конфиг. Ключевое слово - chroot. Как запустить в той-же клетке find?man chroot Хотя я бы рекомендовал относительные ссылки. symlinks -c как ни странно ничего с сылками не сделал... или его надо тоже через chroot пускать? find в клетке не пускается, так как его там нету. а если положить, то нет его библиотек /libexec P.S. Оказывается, symlinks не конвертит ссылки между разными дисками... Однако если вручную поправить на относительные - работает! Как-бы её заставить это сделать?? Edited March 20, 2008 by -=DGN=- Вставить ник Quote
lugoblin Posted March 20, 2008 Posted March 20, 2008 symlinks -c как ни странно ничего с сылками не сделал... или его надо тоже через chroot пускать?Нет, chroot тут совсем никаким боком.Как (и откуда) вы symlinks запускаете? А диагностику оно никакую не дает? Может быть, у вас ссылка и файл на разных файловых системах находятся? find в клетке не пускается, так как его там нету. а если положить, то нет его библиотек /libexecДа, я погорячился. Так просто не получится. Вставить ник Quote
-=DGN=- Posted March 20, 2008 Author Posted March 20, 2008 symlinks -c как ни странно ничего с сылками не сделал... или его надо тоже через chroot пускать?Нет, chroot тут совсем никаким боком.Как (и откуда) вы symlinks запускаете? А диагностику оно никакую не дает? Может быть, у вас ссылка и файл на разных файловых системах находятся? find в клетке не пускается, так как его там нету. а если положить, то нет его библиотек /libexecДа, я погорячился. Так просто не получится. На разных! Каталог PUB подмонтирован кучей дисков... Я вручную переименовал кроссдисковую ссылку - все работает! Чем это сделать автоматически?? Вставить ник Quote
lugoblin Posted March 20, 2008 Posted March 20, 2008 На разных! Каталог PUB подмонтирован кучей дисков...См. секцию BUGS в man symlinks Я вручную переименовал кроссдисковую ссылку - все работает! Чем это сделать автоматически??Переименовывать уже созданные ссылки неэффективно. Надо преобразовывать абсолютный path в относительный на лету, в кажтом цикле exec команды find.Не знаю как bash (или какой там у вас шелл), но это умеет делать perl 5, с помощью библиотеки File::Spec. Как именно установить библиотеку в BSD (пакетом? через cpan?), я ответить затрудняюсь, но не думаю что с этим возникнут сложности, а собственно perl в системе скорее всего уже есть. Очевидно, нужна команда (скрипт или inline) которой можно будет скармливать в качестве аргументов абсолютный путь и базовую директорию (ту где ссылки лежать будут), чтоб эта команда печатала относительный путь на стандартный вывод, подхватывать его оттуда и скармливать команде ln. Команду или скрипт я, с вашего разрешения, за вас писать все-таки не буду. Не обижайтесь ради бога, это принципиальный вопрос. Вставить ник Quote
-=DGN=- Posted March 20, 2008 Author Posted March 20, 2008 В итоге получилось вот такое безобразие... при всей кривизне, оно работает. Может скриптом, оно и правильнее, но я все-же админ, а не программист. Засада конечно, что у 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/Фильмы за месяц" Раз в день такое пускается, юзера должны быть довольны... ;-) Вставить ник Quote
martin74 Posted March 20, 2008 Posted March 20, 2008 а еще правильнее - прикрутить вебморду к каталогу фильмов... И забыть про русские символы на фтп.... Вставить ник Quote
-=DGN=- Posted March 21, 2008 Author Posted March 21, 2008 а еще правильнее - прикрутить вебморду к каталогу фильмов... И забыть про русские символы на фтп.... Это планируется сделать в ближайшее время, но существует довольно много народу которому удобнее через майкрософт нетворк... Да и на сеть нагрузка равномернее чем когда качают... Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.