Linux: використання пошуку для пошуку файлів, старших <date>


31

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

Я не можу знайти нічого на findсторінці "man", щоб це зробити, лише порівняти час з іншим файлом або перевірити на відмінності між створеним часом і тепер. Чи створює файл з потрібним часом і порівнює з цим єдиний спосіб зробити це?


1
Про це краще запитати на SuperUser.com
Джош Броуер

6
Я не збираюся цього закривати: це може бути цікаво і для сисадмінів.
splattne

Команда призначена для частини резервного скрипту, яка захоплює все з / тощо, що було змінено після встановлення в наших нічних резервних копіях.
DrStalker

Дев'ять років, і я щойно помічав, коли модерував нову відповідь: назва та зміст цього питання не вказують однаково. Заголовок запитує "файли, старші ніж <date>", але в тілі зазначено "змінитись після певної дати". Я трактую "після" як новіший, ніж конкретна дата, а не старший.
Джоффрі

Відповіді:


19

Якщо у вас є лише "-новий файл", ви можете вирішити це рішення:

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 посилання
Порівняє часову позначку поточного файлу з посиланням. Довідковий аргумент зазвичай є ім'ям файлу (і для порівняння використовується одна з його часових позначок), але він також може бути рядком, що описує абсолютний час. 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 знайти версію 4.2.27, і він не підтримує -newermt або будь-який -новий параметр, окрім "-newer file"
DrStalker

1
GNU findutils 4.3.3 та новіших підтримках -newerXY згідно savannah.gnu.org/bugs/?11668
Philip Durbin

25

Не пов'язаний безпосередньо з питанням, але може бути цікавим для тих, хто тут натрапляє.

команда find не підтримує безпосередньо параметр -older для пошуку файлів, старших за певну необхідну дату, але ви можете використовувати оператор negate (використовуючи прийнятий приклад відповіді):

touch -t 201003160120 some_file
find . ! -newer some_file

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


3
редактори - можливо, це слід об'єднати у прийняту відповідь?
nEJC

це рішення є найелегантнішим способом вирішити подібне питання :)
Лабінокл

9
find <dir> -mtime -20

ця команда find знайде файли, змінені протягом останніх 20 днів.

  • mtime -> змінено (atime = доступ, ctime = створено)
  • -20 -> менше 20 днів (20 рівно 20 днів, +20 більше 20 днів)

Ви можете додати додаткові обмеження, такі як:

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

те саме, що і раніше, але знаходить лише файли, що закінчуються на ".txt".


5

Просто для додання - ви навіть можете використовувати два новіші аргументи для пошуку за часовий інтервал:

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

щоб знайти всі файли з березня 2007 року.


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))аргумент формату 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 }'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.