Linux: użycie find do zlokalizowania plików starszych niż <data>

31

findma dobrą obsługę wyszukiwania plików zmodyfikowanych mniej niż X dni temu, ale jak mogę findznaleźć wszystkie pliki zmodyfikowane po określonej dacie?

Nie mogę znaleźć niczego na findstronie podręcznika, aby to zrobić, a jedynie porównać z czasem innych plików lub sprawdzić różnice między czasem utworzenia a teraz. Czy tworzenie pliku z pożądanym czasem i porównywanie go z tym jest jedynym sposobem na zrobienie tego?

DrStalker
źródło
1
To byłoby lepiej zapytać na SuperUser.com
Josh Brower
6
Nie zamierzam tego zamykać: może być również interesujące dla sysadminów.
splattne
Polecenie jest częścią skryptu kopii zapasowej, który pobiera wszystko z / etc, które zostało zmienione po instalacji w naszych nocnych kopiach zapasowych.
DrStalker,
Dziewięć lat i właśnie zauważyłem, moderując nową odpowiedź: tytuł i treść tego pytania nie są takie same. Tytuł prosi o „pliki starsze niż <data>”, ale treść stwierdza „zmodyfikowano po określonej dacie”. Interpretuję „po” jako nowszy niż określony termin, a nie starszy.
Joffrey

Odpowiedzi:

19

Jeśli masz tylko „plik odpowiedzi”, możesz zastosować to obejście:

touch -t 201003160120 some_file
find . -newer some_file

dotyk człowieka:

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

Zakładając, że twój dotyk ma tę opcję (moja to dotyk 5.97).

Krzysztof Krasoń
źródło
48

Nie, możesz użyć ciągu daty / godziny.

Od man find:

-newerXY referencja
Porównuje znacznik czasu bieżącego pliku z referencją. Argumentem referencyjnym jest zwykle nazwa pliku (do porównania wykorzystywany jest jeden z jego znaczników czasu), ale może to być również ciąg opisujący czas bezwzględny. X i Y są symbolami zastępczymi dla innych liter, a te litery określają, który czas należy do sposobu wykorzystania odniesienia do porównania.

          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

Przykład:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls
Wstrzymano do odwołania.
źródło
5
Używam Centos 5.2, który używa GNU find w wersji 4.2.27 i nie obsługuje parametru -newermt ani żadnego parametru -newer innego niż „-newer file”
DrStalker
1
GNU findutils 4.3.3 i nowsze obsługują -newerXY według savannah.gnu.org/bugs/?11668
Philip Durbin
25

Nie ma bezpośredniego związku z pytaniem, ale może być interesujący dla niektórych, którzy się tutaj natkną.

polecenie find nie obsługuje bezpośrednio parametru -older do wyszukiwania plików starszych niż wymagana data, ale można użyć instrukcji negate (przy użyciu przykładu z zaakceptowaną odpowiedzią):

touch -t 201003160120 some_file
find . ! -newer some_file

zwróci pliki starsze niż podana data.

nEJC
źródło
3
redaktorzy - może powinien zostać włączony do zaakceptowanej odpowiedzi?
nEJC
to rozwiązanie jest najbardziej eleganckim sposobem na rozwiązanie tego rodzaju problemu :)
Labynocle
9
find <dir> -mtime -20

to polecenie find znajdzie pliki zmodyfikowane w ciągu ostatnich 20 dni.

  • mtime -> zmodyfikowano (atime = uzyskano dostęp, ctime = utworzono)
  • -20 -> mniej niż 20 dni (20 dokładnie 20 dni, +20 więcej niż 20 dni)

Możesz dodać dodatkowe ograniczenia, takie jak:

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

tak samo jak poprzednio, ale wyszukuje tylko pliki z rozszerzeniem „.txt”.

markus_b
źródło
5

Aby dodać - możesz nawet użyć dwóch nowych argumentów do wyszukiwania w przedziale czasu:

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

znaleźć wszystkie pliki z marca 2007.

MortenSickel
źródło
1

Możesz użyć takiego skryptu

#!/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

Zapisz go w zmiennej $ PATH jako „nowszą niż” i spraw, aby był wykonywalny.

Następnie możesz znaleźć plik zmodyfikowany po określonej dacie, takiej jak ta:

newerthan "2010-03-10"

lub

newerthan "last year"

lub

newerthan "yesterday"

To powinno zrobić, co chcesz. Nie sądzę, aby istniał jakiś sposób na osiągnięcie tego inaczej.

Richard Holloway
źródło
Nie trzeba używać bcmatematyki do liczb całkowitych, Bash może to zrobić: ((seconds = when - now))argument formatu datepowinien mieć plus, date +%sa niektóre systemy mogą go nie miećdate -d
wstrzymano do odwołania.
To dotyczy Centos 5.2. Który ma -d. Warto wiedzieć o matematyce liczb całkowitych.
Richard Holloway,
1
find ! -newermt “<DATE>”

lubię to:

find ! -newermt “jan 01 2015” 

To da ci pliki starsze niż 01-01-2015 w twoim bieżącym katalogu.

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

Muzaffar Mahmood
źródło
Właśnie miałem napisać komentarz witający Cię na ServerFault i proszący o ponowne zastanowienie się nad udzieleniem duplikatu odpowiedzi, dopóki nie zdam sobie sprawy, że tytuł pytania i treść mówią różne rzeczy: tytuł prosi o „pliki starsze niż <data>”, a pytanie brzmi „zmodyfikowane po określonej dacie ”, które moim zdaniem to dwie różne rzeczy. Może mógłbyś w swoim poście wyjaśnić różnicę i wyjaśnić użycie negacji. Dziękuję za udział i opublikuję komentarz do pytania w celu wyjaśnienia. Dziękujemy za pomoc!
Joffrey
0

jeśli data jest sformatowana w taki sposób, że można ją porównać,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
użytkownik37841
źródło