Bash ищейка

on 5/03/2012 05:21:00 PM
   С утра аврал случился. Сижу я значит как ни в чем не бывало за своим компом, никого не достаю, отхожу от англицкого и тут на тебе - работа уровня срочнонах и даже быстронах. Похерилась часть БД, восстанавливать придется из документов. После скоропостижного обсуждения кто чем занимается мне вверили поиск файлов которые были залиты клиентами после некоторой даты, назову ее условно 12 апреля 1961 12:35:23.197, потому что космос, потому что Гагарин и наконец гладиолус. Сделаю небольшой отступ - роль мне выделили на подхват, создание  спайдера для этого дела легло на не хрупкие плечи java разработчика. В общем я числился халтурщиком в этом деле.
   Так как ближе консоли мне увы покамест ничего нет(perl и python для меня покамест высоты недостижимые) я решил заюзать мощь bash ибо это святая святых.
   Итак, есть задачка(на первый взгляд вполне тривиальная) и на входе следующие пунктики:
1) найти файлы созданные после 12.04.1961 12:35:23.197;
2) сохранить в документике пути файликов относительно директории где был объявлен федеральный розыск.
   Фронт работы назначен, некогда прохлаждаться(хотя под кондиционером шея совершенно затекла и пришлось набросить безрукавку, это притом что на дворе май бушует и +32).

   Первое что пришло на ум воспользоваться услугой ls и магией sed &/| awk.
   Залезаю в песочницу своей машины(на которой все еще тусуется смышленый сурикат, ubuntu 10.10) там где барахла по больше, ну для чистоты экспериментов и смотрю что мне показывает

ls -ltrR | awk {'print $6 " " $8 '} | sed s/-//g | awk {'if ($1-19610412 > 0 ) {print " " $2}'}

Как видно sed'у было поручено почистить строчки а awk выцарапал сперва дату с именем ну а потом уже и вывел в один столбец то что отфильтровал по дате. Решение со старта не устраивало потому что:
а) не знал ка бы скормить awk таймстэмп который включил бы в себя все до нужной милисекунды;
б) результат не содержал путей что было несомненным промахом этого варианта.

!!! На заметку !!!
<!--   При случае рассмотреть пункт а и б и вообще присмотреться внимательней к этому варианту -->

 Тем не менее беру на вооружение эту фичу и лезу на удаленное файло помойку. Вбиваю в терминал и не получаю ровным счетом ничего. Сцуко, че за нах?! Уж с 61 года что то точно должно было сохранится. Набираю  
ls -al
и получаю вывод примерно такого плана
-rw-r--r-- 1 user users   0 Mar 2012  23 issues.txt

Бядь, кто то любит особо доходчивый формат даты. Естессно почему ls обламывался. Рано нервничать. Набираю info ls, сижу курю. Добираюсь до раздела 10.1.6 Formatting file timestamps и о чудо - вот ты где зарыта! Вот что там нашлось:
   The following option changes how file timestamps are printed.

`--time-style=STYLE'
     List timestamps in style STYLE.  The STYLE should be one of the
     following:
 `full-iso'
          List timestamps in full using ISO 8601 date, time, and time
          zone format with nanosecond precision, e.g., `2002-03-30
          23:45:56.477817180 -0700'.  This style is equivalent to
          `+%Y-%m-%d %H:%M:%S.%N %z'.

          This is useful because the time output includes all the
          information that is available from the operating system.  For
          example, this can help explain `make''s behavior, since GNU
          `make' uses the full timestamp to determine whether a file is
          out of date.

    `long-iso'
          List ISO 8601 date and time in minutes, e.g., `2002-03-30
          23:45'.  These timestamps are shorter than `full-iso'
          timestamps, and are usually good enough for everyday work.
          This style is equivalent to `+%Y-%m-%d %H:%M'.
         
   Значит надо заставить наш терминальчик общаться с нами так как мы желаем. В моем случае удобней было конечно использовать full-iso но подумав о затруднениях которые могут испытать остальные решил взять на вооружение long-iso. Сказано - сделано! Особо не мешкая прописываю в /etc/bashrc следующее:

export TIME_STYLE=long-iso

Сохраняемся и не забываем про source /etc/bashrc. 
Далее проверяем ls -al :

-rw-r--r-- 1 user users   0 2012-05-03 05:59 docs_documents.txt

Bingo!

   Все бы хорошо но как уже упомянул отсутствие путей делало затею с ls бесполезной. 
   Время поджимает, возвращаюсь к своему сурикату и дабы не прокиснуть включаю на репит кавер Axel Rudi Pell – Beautiful Day. Таакс. с настроением вроде поперло, не прокисаем.
   Смотрю в окно и хлопаю  себя по лбу - Балда! а чем тебе старина find не сгодился?!
   Набираю у себя  

find . -type f -newermt '1961 12:35:23.197' > /tmp/found.txt

   Бриллиантовый ты мой!!!

 Проверяю сколько там набежало файла:

find . -type f -newermt '1961 12:35:23.197' | wc -l

Пару тысяч... Ничего, есть чем заняться гоблинам.
  Ну думаю вот он bash в своей красе и решение уже в шляпе. Аха, хер там.

Лезу обратно на сервант, набираю команду, жму ввод и напяливаю торжествующую улыбку и тут же приземляюсь - версия файнда на сервере не знает еще о newermt! Бяяядь!!! Захотелось покурить... Такого удара я на радостях не ожидал. Устанавливать ничего не хотелось - следить на серванте таким уж образом не входило в моих планах  Смотрю тупо в потолок. Что делать? Внутренний голос вдруг как заорет - RTFM!!! Ну че, так то можно разок. Man find... Ага, курю. Прохожу первый раз мимо anewer, я не рассматриваю сравнения с файлом, я хочу сразу дату сравнивать. Ничего вроде не нашел(может плохо искал, дурка мучила однако к тому моменту). В итоге решаю поступить совсем уж костыляво. Думаю а не создать ли файло с нужным таймстампом и его же использовать для сравнения. ОК.
   Итак
touch test -at 6104121235.23
проверяю
stat test
показывает
Access: 1961-04-12 12:35:23.000000000 +0300
Нормально!
find . -type f -anewer test > /tmp/found.txt

Дело сделано! 
К слову получилось три строчки баша против парочки десятков явы...
Вот собственно так закончились утренние приключения с розыском.

!!!ТуДу!!!

Привести в чувство все это дело посредством скрипта и разрулить оставшиеся непонятные вопросы.

Технологии Blogger.

Copyright © 2012 Чердачек Drakkart'a All rights reserved.