Как использовать «найти» для поиска файлов, созданных на определенную дату?

208

Как использовать команду UNIX find для поиска файлов, созданных в определенную дату?

  • 8
    Похоже, вопросы bash-скриптинга разрешены.
  • 0
    @MichaelScheper: я даже не знаю, с чего начать этот комментарий.
Показать ещё 3 комментария
Теги:
find

9 ответов

233
Лучший ответ

Как указано Max, вы не можете, но проверка файлов, модифицированных или доступных, не так уж и трудна. Я написал учебник об этом, уже сегодня. Суть которого заключается в использовании -newerXY и ! -newerXY:

Пример. Чтобы найти все файлы, измененные 7 июня 2007 года:

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

Чтобы найти все файлы, к которым обращались 29 сентября 2008 года:

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

Или файлы, которые с их разрешения изменились в один день:

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

Если вы не изменяете права доступа к файлу, 'c' обычно соответствует дате создания.

  • 7
    Моя версия find (GNU 4.2.32) не поддерживает предикаты -newerXY. Нужна ли конкретная минимальная версия? Или это случай компиляции find с помощью специального переключателя configure?
  • 1
    @yukondude: Ты прав. Локальная версия find у меня - GNU 4.4.0 - есть, а у 4.1.20, что у меня на Dreamhost, нет. Kludge с созданием двух файлов должен работать в любом случае.
Показать ещё 4 комментария
57

find location -ctime time_period

Примеры time_period:

  • Более 30 дней назад: -ctime +30

  • Менее 30 дней назад: -ctime -30

  • Ровно 30 дней назад: -ctime 30

  • 7
    Проблема в том, что я хочу проверить на определенную дату, а не в течение определенного периода времени.
  • 1
    Итак, выясните, сколько дней назад это число, и используйте это число.
Показать ещё 1 комментарий
43

Это два шага, но мне нравится делать это следующим образом:

Сначала создайте файл с определенной датой/временем. В этом случае файл будет в 2008-10-01 в полночь

touch -t 0810010000 /tmp/t

Теперь мы можем найти все файлы, которые являются более новыми или более старыми, чем указанный выше файл (по дате изменения файла. Вы также можете использовать -anewer для доступа и -cnewer статус файла изменен).

find / -newer /tmp/t
find / -not -newer /tmp/t

Вы также можете посмотреть файлы между определенными датами, создав два файла с сенсорным экраном

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

Это найдет файлы между двумя датами и временем

find / -newer /tmp/t1 -and -not -newer /tmp/t2
  • 3
    +1 за решение старой find которой отсутствует -newerXY
  • 1
    ИМО, сейчас это должно быть принятое решение. Я не смог заставить -newermt работать на ядре 2.6.18-348.18.1.el5, не говоря уже о новых ядрах.
Показать ещё 1 комментарий
23

Вы можете сделать это:

find ./ -type f -ls |grep '10 Sep'

Пример:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24
  • 0
    Это то, чего хочет большинство людей, но он не получил достаточно голосов !!!
  • 2
    это может не сработать, если несколько миллионов файлов находятся в одном каталоге.
Показать ещё 2 комментария
10

Вы не можете. Переключатель -c сообщает вам, когда были изменены разрешения, - проверяет самое последнее время доступа, а -m проверяет время модификации. Файловая система, используемая большинством разновидностей Linux (ext3), не поддерживает запись "время создания". Извините!

  • 7
    На самом деле, это не просто тип файловой системы - здесь нет системного интерфейса для получения такой информации, даже если файловая система содержит ее. Один из недостатков Unix восходит к самым ранним дням, поэтому Unix никогда не взлетит.
7

@Max: правильно о времени создания.

Однако, если вы хотите рассчитать аргумент прошедших дней для одного из параметров -atime, -ctime, -mtime, вы можете использовать следующее выражение

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Замените "2008-09-24" на любую дату, которую вы хотите, и ELAPSED_DAYS будет установлено на количество дней между тем и сегодня. (Обновить: вычесть один из результата для выравнивания с округлением даты find.)

Итак, чтобы найти файл, измененный 24 сентября 2008 года, команда будет следующей:

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

Это будет работать, если ваша версия find не поддерживает предикаты -newerXY, упомянутые в @Arve: answer.

2

С помощью переключателей -time, -ctime и -mtime, которые вы можете найти, вы можете приблизиться к тому, что вы хотите достичь.

-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir
  • 1
    Почему вы копируете файлы? Кроме того, команда в `ls ...` работает, она не использует инструмент find .
-6

Я нашел этот скрипт в script, который удаляет все файлы старше 14 дней:

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

Я думаю, что немного дополнительного "поиска человека" и поиска параметров -ctime/-atime и т.д. помогут вам здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню