Як за допомогою "знайти" шукати файли, створені на певну дату? [зачинено]


254

Як використовувати команду UNIX findдля пошуку файлів, створених у певну дату?


8
Здається, питання щодо сценаріїв на базі дозволяється.
Алан

@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
Моя версія пошуку (GNU 4.2.32), схоже, не підтримує предикати -newerXY. Чи потрібна конкретна мінімальна версія? Або це випадок компіляції знаходження за допомогою спеціального перемикача налаштування?
yukondude

1
@yukondude: Ти маєш рацію. Версія знаходження у мене локально - GNU 4.4.0 - має її, тоді як 4.1.20, яку я маю на Dreamhost, не має. Незвідане створення двох файлів має працювати в будь-якому.
Арве

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не має нічого спільного з часом створення , це час зміни inode.
Стефан Шазелас

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, новіша функціональність, здається, дуже
вибаглива

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 міститься у назві файлу.
Снорекс

mywiki.wooledge.org/ParsingLs - кращий підхід - це, мабуть, друк дати створення у машиночитаному вигляді, можливо, statякщо у вас її немає find -printf.
трійчатка

12

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


7
Насправді це не лише тип файлової системи - не існує системного інтерфейсу для отримання такої інформації, навіть якщо файлова система її зберігала. Один з недоліків Unix, що повертається до найдавніших днів, саме тому Unix ніколи не зніме.
chrisdowney

1
Unix ніколи не злетить?
lucid_dreamer

8

@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:.


2

За допомогою перемикачів -aime, -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

Я думаю, що трохи додаткового "пошуку людини" і пошуку параметрів -ctime / -atime etc. допоможуть вам тут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.