Linux: использование find для поиска файлов старше <date>

31

findимеет хорошую поддержку для поиска файлов, более измененных менее X дней назад, но как я могу использовать, findчтобы найти все файлы, измененные после определенной даты?

Я не могу найти что-либо на findстранице руководства, чтобы сделать это, только для сравнения с временем других файлов или для проверки различий между созданным временем и сейчас. Является ли создание файла с нужным временем и сравнение с этим единственным способом сделать это?

DrStalker
источник
1
Об этом лучше спросить на SuperUser.com
Джош Брауэр
6
Я не собираюсь закрывать это: это может быть интересно и для системных администраторов.
splattne
Эта команда предназначена для части скрипта резервного копирования, который извлекает все из / etc, которое было изменено после установки в наших ночных резервных копиях.
DrStalker
Девять лет, и я только заметил, модерируя новый ответ: название и тело этого вопроса не утверждают то же самое. Заголовок запрашивает «файлы старше <date>», но в теле указывается «изменено после определенной даты». Я интерпретирую «после» как более новую, чем определенную дату, а не старше.
Джоффри

Ответы:

19

Если у вас есть только «-newer file», вы можете обойти это:

touch -t 201003160120 some_file
find . -newer some_file

сенсорный человек:

  -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

Предполагая, что у вашего касания есть эта опция (у меня сенсорный 5.97).

Кшиштоф Красонь
источник
48

Нет, вы можете использовать строку даты / времени.

От man find:

-newerXY reference
Сравнивает временную метку текущего файла со ссылкой. Ссылочным аргументом обычно является имя файла (и для сравнения используется одна из его временных меток), но это также может быть строка, описывающая абсолютное время. X и Y являются заполнителями для других букв, и эти буквы выбирают, какое время относится к тому, как ссылка используется для сравнения.

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

Пример:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls
Приостановлено до дальнейшего уведомления.
источник
5
Я использую Centos 5.2, который использует GNU find версии 4.2.27, и он не поддерживает параметр -newermt или любой параметр -newer, кроме "-newer file"
DrStalker
1
GNU findutils 4.3.3 и новее поддерживает -newerXY в соответствии с savannah.gnu.org/bugs/?11668
Филипп Дурбин
25

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

Команда find напрямую не поддерживает параметр -older для поиска файлов старше определенной даты, но вы можете использовать оператор отрицания (используя пример принятого ответа):

touch -t 201003160120 some_file
find . ! -newer some_file

вернет файлы старше указанной даты.

Nejc
источник
3
редакторы - может быть, это следует объединить в принятый ответ?
nEJC
Это решение - самый элегантный способ решения этой проблемы :)
Labynocle
9
find <dir> -mtime -20

Эта команда поиска найдет файлы, измененные за последние 20 дней.

  • mtime -> измененный (atime = доступный, ctime = созданный)
  • -20 -> менее 20 дней (20 ровно 20 дней, +20 более 20 дней)

Вы можете добавить дополнительные ограничения, такие как:

find <dir> -mtime -20 -name "*.txt"

так же, как и раньше, но находит только файлы, заканчивающиеся на «.txt».

markus_b
источник
5

Просто для добавления - вы можете даже использовать два новых аргумента для поиска во временном интервале:

find ! -newermt "apr 01 2007" -newermt "mar 01 2007" -ls

найти все файлы с марта 2007 года.

MortenSickel
источник
1

Вы могли бы использовать такой скрипт

#!/bin/bash

if [ $# -ne 1 ];then
  when="today"
else
  when=` date -d "$1" +"%s" `
fi
now=`date +"%s"`

seconds=`echo "$when - $now" | bc`
minutes=`echo "$seconds / 60 " | bc `

find . -cmin $minutes -print

Сохраните его в вашем $ PATH как «newerthan» и сделайте его исполняемым.

Затем вы можете найти файл, модифицированный после определенной даты, например:

newerthan "2010-03-10"

или

newerthan "last year"

или

newerthan "yesterday"

Это должно делать то, что вы хотите. Я не думаю, что есть способ, чтобы добиться этого иначе.

Ричард Холлоуэй
источник
Нет необходимости использовать bcдля целочисленной математики, Bash может сделать это: ((seconds = when - now))аргумент формата to dateдолжен иметь плюс, date +%sа некоторые системы могут не иметьdate -d
Пауза до дальнейшего уведомления.
Это для Centos 5.2. Который имеет -d. Полезно знать о целочисленной математике, хотя.
Ричард Холлоуэй
1
find ! -newermt “<DATE>”

так:

find ! -newermt “jan 01 2015” 

Это даст вам файлы старше 01-01-2015 в вашем текущем каталоге.

https://muzaffarmahmoodblog.wordpress.com/2019/07/11/linux-command-to-remove-files-older-than-2015-in-a-directory/

Музаффар Махмуд
источник
Я собирался написать комментарий, приветствуя вас на ServerFault и прося вас пересмотреть изложение дублирующего ответа, пока я не понял, что заголовок и тело вопроса говорят разные вещи: заголовок запрашивает «файлы старше <date>» и измененные состояния вопроса после определенной даты », что, на мой взгляд, две разные вещи. Возможно, вы могли бы в своем посте уточнить разницу и объяснить использование отрицания. Спасибо за помощь, и я оставлю комментарий для уточнения вопроса. Спасибо за участие!
Джоффри
0

если ваша дата отформатирована так, что ее можно сравнить для сравнения,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
user37841
источник