Linux: menggunakan find untuk mencari file yang lebih lama dari <tanggal>

31

findmemiliki dukungan yang baik untuk menemukan file yang lebih dimodifikasi kurang dari X hari yang lalu, tetapi bagaimana saya dapat menggunakan finduntuk menemukan semua file yang dimodifikasi setelah tanggal tertentu?

Saya tidak dapat menemukan apa pun di findhalaman manual untuk melakukan ini, hanya untuk membandingkan dengan waktu file lain atau untuk memeriksa perbedaan antara waktu yang dibuat dan sekarang. Apakah membuat file dengan waktu yang diinginkan dan membandingkan dengan itu satu-satunya cara untuk melakukan ini?

DrStalker
sumber
1
Ini akan lebih baik ditanyakan di SuperUser.com
Josh Brower
6
Saya tidak akan menutup ini: bisa jadi menarik untuk sysadmin juga.
splattne
Perintah ini untuk bagian dari skrip cadangan, yang mengambil semuanya dari / etc yang telah diubah pasca-pemasangan di cadangan malam kami.
DrStalker
Sembilan tahun dan saya baru sadar ketika memoderasi jawaban baru: judul dan isi pertanyaan ini tidak menyatakan hal yang sama. Judul meminta 'file yang lebih lama dari <tanggal>' tetapi badan menyatakan 'dimodifikasi setelah tanggal tertentu'. Saya mengartikan 'setelah' sebagai yang lebih baru dari tanggal tertentu, bukan yang lebih tua.
Joffrey

Jawaban:

19

Jika Anda hanya memiliki '-newer file' maka Anda dapat mengambil solusi ini:

touch -t 201003160120 some_file
find . -newer some_file

sentuhan pria:

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

Dengan asumsi bahwa sentuhan Anda memiliki opsi ini (milik saya adalah sentuh 5.97).

Krzysztof Krasoń
sumber
48

Tidak, Anda dapat menggunakan string tanggal / waktu.

Dari man find:

-newerXY reference
Membandingkan timestamp file saat ini dengan referensi. Argumen referensi biasanya nama file (dan salah satu cap waktu yang digunakan untuk perbandingan) tetapi mungkin juga berupa string yang menggambarkan waktu absolut. X dan Y adalah pengganti untuk surat-surat lain, dan surat-surat ini memilih waktu mana yang menjadi acuan referensi digunakan.

          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

Contoh:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls
Dijeda sampai pemberitahuan lebih lanjut.
sumber
5
Saya menggunakan Centos 5.2, yang menggunakan GNU find versi 4.2.27, dan tidak mendukung -newermt atau parameter -newer lain selain "-newer file"
DrStalker
1
GNU findutils 4.3.3 dan yang lebih baru mendukung -newerXY menurut savannah.gnu.org/bugs/?11668
Philip Durbin
25

Tidak terkait langsung dengan pertanyaan, tetapi mungkin menarik untuk beberapa yang tersandung di sini.

perintah find tidak secara langsung mendukung parameter -older untuk menemukan file yang lebih tua dari tanggal yang disyaratkan, tetapi Anda dapat menggunakan pernyataan negate (menggunakan contoh jawaban yang diterima):

touch -t 201003160120 some_file
find . ! -newer some_file

akan mengembalikan file yang lebih lama dari tanggal yang diberikan.

nEJC
sumber
3
editor - mungkin itu harus digabung menjadi jawaban yang diterima?
nEJC
solusi ini adalah cara paling elegan untuk menyelesaikan masalah seperti ini :)
Labynocle
9
find <dir> -mtime -20

perintah find ini akan menemukan file yang dimodifikasi dalam 20 hari terakhir.

  • mtime -> dimodifikasi (atime = diakses, ctime = dibuat)
  • -20 -> kurang dari 20 hari (20 tepat 20 hari, +20 lebih dari 20 hari)

Anda dapat menambahkan batasan tambahan seperti:

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

sama seperti sebelumnya, tetapi hanya menemukan file yang diakhiri dengan '.txt'.

markus_b
sumber
5

Hanya untuk menambahkan - Anda bahkan dapat menggunakan dua argumen newermt untuk mencari dalam interval waktu:

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

untuk menemukan semua file dari Maret 2007.

MortenSickel
sumber
1

Anda bisa menggunakan skrip seperti ini

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

Simpan di $ PATH Anda sebagai "newerthan" dan buat itu bisa dieksekusi.

Kemudian Anda dapat menemukan file yang dimodifikasi setelah tanggal tertentu seperti ini:

newerthan "2010-03-10"

atau

newerthan "last year"

atau

newerthan "yesterday"

Itu harus melakukan apa yang Anda inginkan. Saya tidak berpikir ada cara dibangun untuk mencapai ini sebaliknya.

Richard Holloway
sumber
Ini tidak perlu digunakan bcuntuk bilangan bulat matematika, Bash dapat melakukannya ((seconds = when - now)):, argumen format dateharus memiliki nilai tambah date +%sdan beberapa sistem mungkin tidak memilikidate -d
Berhenti sebentar sampai pemberitahuan lebih lanjut.
Ini untuk Centos 5.2. Yang memang memiliki -d. Berguna untuk mengetahui tentang matematika bilangan bulat.
Richard Holloway
1
find ! -newermt “<DATE>”

seperti ini:

find ! -newermt “jan 01 2015” 

Ini akan memberi Anda file yang lebih tua dari 01-01-2015 di direktori Anda saat ini.

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

Muzaffar Mahmood
sumber
Saya baru saja akan menulis komentar yang menyambut Anda di ServerFault dan meminta Anda untuk mempertimbangkan kembali mengajukan jawaban duplikat sampai saya menyadari judul pertanyaan dan badan mengatakan hal-hal yang berbeda: judul meminta 'file yang lebih lama dari <tanggal>' dan status pertanyaan 'dimodifikasi setelah tanggal tertentu ', yang menurut saya adalah dua hal yang berbeda. Mungkin Anda bisa di pos Anda menjelaskan perbedaan dan menjelaskan penggunaan negate. Terima kasih telah berkontribusi dan saya akan mengirim komentar pada pertanyaan untuk klarifikasi. Terima kasih telah berkontribusi!
Joffrey
0

jika kencan Anda diformat sedemikian rupa sehingga tidak masalah untuk perbandingan,

mydate=201003160120
find . -type f -printf "%AY%Am%Ad%AH%AM%AS/:%p\n" | awk -vd="$mydate" -F'/:' '$1 > d{ print $2 }'
pengguna37841
sumber