UNIX/BASH: файлы, измененные в конкретном месяце
Я борюсь с листинговыми файлами, измененными в конкретный месяц (например, февраль).
Вот несколько неудачных попыток:
1) Я попытался создать временные файлы и установить их временную метку в первый раз в следующем месяце и в первый раз в целевом месяце и использовать -newer в поиске, например:
find -newer "$from" ! -newer "$to"
В этом списке перечислены файлы, измененные в интервале времени ($ from, $to], но мне нужен временной интервал [$ from, $to) (в противном случае были бы ложные срабатывания для файлов, созданных в первую секунду в в следующем месяце). Файлы листинга, измененные в феврале, являются дополнительной проблемой, поскольку для этого потребуется установить одну из временных меток на самую большую в феврале, но число дней в феврале варьируется в зависимости от того, является ли это високосным годом или нет, что требует дополнительной проверки.
2) Если я использую ls
, я вижу много осложнений при разборе, из-за того, что имя пользователя или группа содержат пробелы.
Есть ли простой способ и относительно переносимый способ сделать это (поэтому он работает в течение любого месяца, независимо от имен файлов и т.д.)?
Ответы
Ответ 1
date
позволяет вам легко создавать временные метки для таких целей:
date -d "01-Mar-2011 -1 sec" # last second of Feb-2011
К счастью, такой же синтаксис возможен в find
:
month="Mar-2010"
find . -newermt "01-$month -1 sec" -and -not -newermt "01-$month +1 month -1 sec"
найдет все файлы, измененные в марте 2010 года.
Ответ 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-