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


254

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


8
Похоже, вопросы bash-скриптинга разрешены.
Алан

@MichaelScheper: я даже не знаю, с чего начать этот комментарий.
Гонки легкости на орбите

1
@Notinlist: вот ответ: meta.stackexchange.com/questions/10249/… К сожалению, оказалось, что срок истек. Жаль, потому что поиски в сети все еще приземляются здесь, и принятый ответ был полезен для многих людей.
Майкл Шепер

@MichaelScheper: Если вы можете найти возможность проголосовать за переход на unix.stackexchange.com, обязательно укажите мне. Поскольку у вас нет представителя, чтобы увидеть закрывающийся диалог, я дам вам подсказку: его нет. Подумайте о том, чтобы быть менее воинственным, когда вы не понимаете, о чем говорите. Спасибо за внимание.
Гонки легкости на орбите

5
@LightnessRacesinOrbit: Я прошу прощения за то, что выглядел как «боевой». Мне не разрешено редактировать мои комментарии, но для дальнейшего использования, был ли мой комментарий восхваляющим вопрос, который вас обидел? Я должен сказать, что я чувствую себя немного слепым, даже после того, как вы дали свой предыдущий комментарий пользу от сомнения. На самом деле я пытался быть более конструктивным, чем добавление другого «я тоже», выясняя, как работает миграция: meta.stackexchange.com/a/10250/249555 60-дневный срок, возможно, скрывает эту опцию? Извините за задницу. Еще раз спасибо - искренне - за ваше время и внимание.
Майкл Шепер

Ответы:


323

Как отметил Макс, вы не можете, но проверка файлов, измененных или доступных, не так уж сложна. Я написал учебник об этом, еще сегодня. Суть которого заключается в использовании -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?
yukondude

1
@yukondude: Ты прав. Локальная версия find у меня - GNU 4.4.0 - есть, а у 4.1.20, что у меня на Dreamhost, нет. Kludge с созданием двух файлов должен работать в любом случае.
Arve

1
В некоторых системах (FreeBSD, OS / X ...) -newerBtсовпадает по времени рождения (создания) файла .
Стефан Шазелас

3
Обратите внимание, что -newerxtон доступен во FreeBSD с 2001 года (где он был впервые представлен в виде патча в 1998 году), некоторые другие BSD и GNU находят (начиная с 4.3.3 в 2007 году) на основе поиска HP / UX, который был представлен -newerXY(но где Y == t не поддерживается).
Стефан Шазелас

Используя: find (GNU findutils) 4.4.0, этот синтаксис не работает на SUSE ext3, если он должен перечислить файлы / w mtime на эту дату, он ничего не возвращает
niken

68

find location -ctime time_period

Примеры time_period:

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

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

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


7
Проблема в том, что я хочу проверить на определенную дату, а не в течение определенного периода времени.
sverrejoh

1
Итак, выясните, сколько дней назад это число, и используйте это число.
jmanning2k

15
ctimeне имеет никакого отношения ко времени создания , это время смены инода.
Стефан Шазелас

47

Это два шага, но мне нравится делать это так:

Сначала создайте файл с определенной датой / временем. В этом случае файл 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, не говоря уже о новых ядрах.
DarkForce

То же самое здесь, DarkForce, функциональность newermt, кажется, очень и очень
шаткая

34

Вы могли бы сделать это:

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

Это то, чего хочет большинство людей, но он не получил достаточно голосов !!!
Sjas

2
это может не сработать, если несколько миллионов файлов находятся в одном каталоге.
Деннис Нольте

3
Есть побочные эффекты, если термин поиска grep находится в имени файла.
Snorex

mywiki.wooledge.org/ParsingLs - лучший подход, вероятно, состоит в том, чтобы напечатать дату создания в машиночитаемой форме, возможно, statесли у вас ее нет find -printf.
tripleee

12

Ты не можешь Ключ -c сообщает вам, когда разрешения были изменены в последний раз, -a проверяет самое последнее время доступа и -m проверяет время изменения. Файловая система, используемая большинством версий Linux (ext3), не поддерживает запись «время создания». Сожалею!


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

1
Unix никогда не взлетит?
lucid_dreamer

8

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

Тем не менее, если вы хотите , чтобы вычислить истекшие дни аргумента для одного из -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 :.


2

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


-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

1
Почему вы копируете файлы? Помимо команды в `ls ...`работах, он не использует findинструмент.
Яманеко

-5

Я нашел этот сценарий в сценарии, который удаляет все файлы старше 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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.