Aku berjuang untuk membungkus pikiran saya sekitar mengapa yang find
menafsirkan mengajukan kali modifikasi jalan tersebut. Secara khusus, saya tidak mengerti mengapa -mtime +1
file tidak menampilkan kurang dari 48 jam.
Sebagai contoh pengujian, saya membuat tiga file pengujian dengan tanggal modifikasi berbeda:
[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3
Saya kemudian menjalankan find dengan -mtime +1
switch dan mendapatkan output berikut:
[root@foobox findtest]# find -mtime +1
./foo3
Saya kemudian menjalankan find dengan -mmin +1440
dan mendapatkan output berikut:
[root@foobox findtest]# find -mmin +1440
./foo3
./foo2
Sesuai halaman manual untuk menemukan, saya mengerti bahwa ini adalah perilaku yang diharapkan:
-mtime n
File’s data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
Ini masih tidak masuk akal bagi saya. Jadi, jika sebuah file berumur 1 hari, 23 jam, 59 menit, dan 59 detik, find -mtime +1
abaikan semua itu dan anggap saja itu seperti 1 hari, 0 jam, 0 menit, dan 0 detik? Dalam hal ini, secara teknis tidak lebih tua dari 1 hari dan diabaikan?
Tidak ... tidak ... menghitung.
sumber
Jawaban:
Yah, jawabannya yang sederhana adalah, saya kira, bahwa implementasi find Anda mengikuti standar POSIX / SuS, yang mengatakan itu harus berperilaku seperti ini. Mengutip dari SUSv4 / IEEE Std 1003.1, 2013 Edition, "find" :
(Di tempat lain dalam dokumen itu dijelaskan bahwa
n
sebenarnya bisa+n
, dan makna itu sebagai "lebih besar dari").Mengapa standar mengatakan itu akan berperilaku dengan cara-baik, aku rasa panjang di masa lalu programmer malas atau tidak berpikir tentang hal itu, dan hanya menulis kode C
(current_time - file_time) / 86400
. Aritmetika C integer membuang sisanya. Script mulai tergantung pada perilaku itu, dan karenanya distandarisasi.Perilaku spec'd juga akan portabel untuk sistem hipotetis yang hanya menyimpan tanggal modifikasi (bukan waktu). Saya tidak tahu apakah sistem seperti itu sudah ada.
sumber
Argumen untuk
-mtime
ditafsirkan sebagai jumlah hari penuh dalam usia file.-mtime +n
berarti lebih besar dari ,-mtime -n
berarti sangat kurang dari.Perhatikan bahwa dengan Bash, Anda dapat melakukan yang lebih intuitif:
untuk menemukan file yang lebih lama dan lebih baru dari 24 jam, masing-masing.
(Ini juga lebih mudah daripada mengetikkan argumen fraksional
-mtime
ketika Anda ingin resolusi dalam jam atau menit.)sumber
$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
$(())
adalah sintaks aritmatika shell biasa, ini tidak spesifik untuk Bash, lih. pubs.opengroup.org/onlinepubs/009695399/utilities/...This chapter describes the syntax of that command language as it is used by the sh utility and [...]
. Karena Bash adalah SH "extended", ia mendukung sintaks ini, tetapi beberapa shell lain tidak, misalnya csh / tcsh./bin/sh
.Periode 24 jam pecahan terpotong! Itu berarti “find -mtime +1” mengatakan untuk mencocokkan file yang dimodifikasi dua hari atau lebih yang lalu.
Yang berikut ini hanya dapat bekerja pada GNU?
sumber
Iya. Seperti
man find
kata, "bagian pecahan diabaikan". Jika Anda membagi "1 hari, 23 jam, 59 menit, dan 59 detik" hingga "24 jam", Anda mungkin mendapatkan 1,9999, tetapi bagian .9999 kemudian dilucuti dan tiba-tiba file tersebut hanya berusia 1 hari.sumber
-mtime N
berarti file yang usianya A dalam hari memenuhi N ≤ A < N +1. Dengan kata lain, pilih file yang terakhir diubah antara N dan N +1 hari yang lalu.-mtime N
-mtime -N
berarti file yang usianya A memenuhi A < N , yaitu file yang dimodifikasi kurang dari N hari yang lalu. Kurang intuitif, berarti file yang usianya A memenuhi N +1 ≤ A , yaitu file yang diubah setidaknya N +1 hari yang lalu.-mtime +N
Misalnya,
-mtime 1
memilih file yang dimodifikasi antara 1 dan 2 hari yang lalu.-mtime +1
memilih file yang telah diubah setidaknya 2 hari yang lalu. Untuk mendapatkan file yang dimodifikasi setidaknya 1 hari yang lalu, gunakan-mtime +0
.Deskripsi "terakhir diubah n * 24 jam yang lalu" hanya merupakan perkiraan, dan bukan yang sangat jelas.
Jika Anda merasa aturan ini sulit diingat, gunakan file referensi sebagai gantinya.
(Sintaks "1 hari yang lalu" memerlukan GNU
touch
.)sumber
find
!Gunakan -mmin, -amin, dll untuk mendapatkan hasil yang tepat
sumber
-?min
argumen bekerja persis seperti-?time
argumen kecuali dengan menit bukan hari. Mereka juga tidak "tepat".Jika Anda menginginkan file yang berumur 48 jam, bukan 2 hari, maka Anda harus menambahkan perintah
--daystart
Andafind
. Ini akan membantu Anda.sumber
-daystart
(ekstensi GNU), bukan--daystart
. Kemudian,-daystart
hanya berarti membandingkan waktu dengan awal hari ini daripada waktu saat ini, jadi--daystart -mtime +1
akan melaporkan file yang dimodifikasi lebih dari 48 jam / 2 jam sebelum awal hari ini, jadi biasanya file yang dimodifikasi secara kaku sebelum hari sebelum kemarin .