UNIX/BASH: файлы, измененные в конкретном месяце

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

1) Я попытался создать временные файлы и установить их временную метку в первый раз в следующем месяце и в первый раз в целевом месяце и использовать -newer в поиске, например:

find -newer "$from" ! -newer "$to"

В этом списке перечислены файлы, измененные в интервале времени ($ from, $to], но мне нужен временной интервал [$ from, $to) (в противном случае были бы ложные срабатывания для файлов, созданных в первую секунду в в следующем месяце). Файлы листинга, измененные в феврале, являются дополнительной проблемой, поскольку для этого потребуется установить одну из временных меток на самую большую в феврале, но число дней в феврале варьируется в зависимости от того, является ли это високосным годом или нет, что требует дополнительной проверки.

2) Если я использую ls, я вижу много осложнений при разборе, из-за того, что имя пользователя или группа содержат пробелы.

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

Ответ 2

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

$ touch -t 201102010000.01 from
$ touch -t 201102282359.59 to
$ touch -t 201103010000.01 march
$ touch -t 201101312359.59 january

$ ls -l
total 0
-rw-r--r-- 1 mike None 0 Feb  1 00:00 from
-rw-r--r-- 1 mike None 0 Jan 31 23:59 january
-rw-r--r-- 1 mike None 0 Mar  1 00:00 march
-rw-r--r-- 1 mike None 0 Feb 28 23:59 to

Затем, используя GNU 'find', как это, кажется, отображаются только файлы, чья метка времени находится в феврале.

$ find -newermt '2011-02-01' ! -newermt '2011-03-01' -print
./from
./to

Я не знаю, насколько переносимы эти аргументы для других версий "найти".

Ответ 3

Добавление в ответ Pumbaa80:

В моей предварительной производственной среде find не поддерживает -newermt.

Вместо этого я сделал следующее:

  • Получить список всех возможных файлов (через find, ls и т.д.)
  • Создайте метки времени последней секунды последнего месяца и этого месяца

    LAST_MONTH=$(date -d "01-Jun-2015" -1 sec +%s)
    THIS_MONTH=$(date -d "31-Jul-2015" +%s)
    
  • Перейдите по списку из точки 1 и сравните временную метку каждого файла с метками времени из пункта 2

    for file in $LIST_OF_FILES
    do
        TIMESTAMP=$(stat -c"%Y" $file)
        if (( $LAST_MONTH < $TIMESTAMP ))
        then
            if (( $TIMESTAMP < $THIS_MONTH ))
            then
            echo "Your code here"
            fi
        fi
    done
    

Ответ 4

Обходным решением может быть использование опции -printf для find:

find -printf "%Cm %p\\n"| egrep ^02 |cut -b4-

Я не думаю, что find может фильтровать сам результат -printf, а также не может фильтровать элементы даты.

изменить или если вы действительно хотите получить ls -like:

find -printf "%Cm " -ls | egrep ^02 |cut -b4-