На сервере есть папка, к которую время от времени скачиваются файлы с данными.
Файлы поступают через разные промежутки времени,
иногда с запозданием на 2-3 дня (как сделает оператор), с разными именами.Мой скрипт (sh, или можно csh) запускается каждый час,
он должен выбирать из всех файлов в этой директории самый свеже- поступивший файл,
и дальше обрабатывать данные в нем.Но вот как же выбрать этот самый свежий файл?
Дорогие специалисты, может кто-нибудь сможет мне помочь?
ls -t | head -1
> ls -t | head -1s/-t/-t1/
>> ls -t | head -1
> s/-t/-t1/Не обязательно. -1 включается автоматически при передаче данных в pipe, насколько я помню ;-)
(раньше тоже так писал, ага)
find -type f -print0 |xargs -0 stat -c"%Y %n"|sort -k1,1nr|head -1|sed 's_^[^ ]\+ __'
Спасибо!!!Буду пробовать все варианты, результат сообщу!!
ls -tr|tail -n1
> Мой скрипт (sh, или можно csh) запускается каждый час,
> Но вот как же выбрать этот самый свежий файл?А если их за час поступит 2 и больше?
# Раз в час пускать скрипт,
# находить все файлы, новее чем .timeaccessflagfind /var/lib/ftp/inbound -anewer /var/lib/ftp/inbound/.timeaccessflag;
# Единственный косяк, если во время работы скрипта придёт другой файл.
# А по закону Мерфи, этот косяк произойдёт с самым нужным сообщением и
# в самое неподходящие время.
# Можно как-то блокировать приём, если по IP, то через iptables,
# если по модему/факсу/мобиле, то поднимать трубку.# в конце скрипта обновить access time у флага.
touch /var/lib/ftp/inbound/.timeaccessflag;# и возобновить приём.
Спасибо огромное всем!! Меня очень заинтересовала команда ls!!Взяла первый вариант - ls -t | head -1.
Но оказалось, что действительно за час может прийти 2-3 файла:-)).
Оператор их обрабатывает в произвольное время суток,
иногда с задержкой 3 дня и выкладывает сразу все.Сегодня в 11.36 пришло 2 штуки:
f-22-01-2011.JPG
f-21-01-2011.JPG
И время создания у обоих абсолютно одинаковое - 11:36:00 !! Такого облома я не ожидала!!!Команда ls -t | head -1 без зазрения совести выдает f-21-01-2011.JPG.
Команда find -type f -print0 |xargs -0 stat -c"%Y %n"|sort -k1,1nr|head -1|sed 's_^[^ ]\+ __' - тоже f-21-01-2011.JPG.Но ведь понятно, что f-22-01-2011.JPG сделан позже, чем f-21-01-2011.JPG.
Тогда я буду скачивать данные за каждый месяц в отдельную папку,
а внутри папки сортировать по имени!!Вот так:
cd /f/`date -u +%Y`/`date -u +%m`
file_name=`ls | tail -n1`Только еще придется в начале месяца проверять новые поступления в папке за предыдущий месяц, вдруг оператор выложит файл за 30 число
в следующем месяце...:-(( Но они пообещали больше недели не задерживать.
> И время создания у обоих абсолютно одинаковое - 11:36:00 !! Такого облома
> я не ожидала!!!Моя говорила :)
> Только еще придется в начале месяца проверять новые поступления в папке
> за предыдущий месяц, вдруг оператор выложит файл за 30 число
> в следующем месяце...:-(( Но они пообещали больше недели не задерживать.Зачем проверять по несколько раз, сделай как выше написал - со своим флагом.
Все файлы, у которых время модификации меньше чем у флага, считаются новыми.
То есть ты задавай правила игры, а не они.
Может у них другой косяк будет, например, скоро перевод часов на летнее время
или февраль - короткий месяц, хрен знает как у них там работает рассылка.
Может выставлена на 30 число, вот и придёт тебе за 28 февраля только 30 марта,
что явно больше месяца.
Язык shell богат и могуч. Я перехитрю операторов:-)
> Язык shell богат и могуч. Я перехитрю операторов:-)Кстати, хороший способ - это перемещать все обработанные файлы в архив (другую папку),
тогда любой файл в рабочем каталоге считается не обработанным.