Neden -mtime +1'i yalnızca 2 günden daha eski dosyaları bulur?


117

Etrafa fikrimi sarmak için mücadele ediyorum nedenfind yorumlayıp öyle yolu değişiklik zamanları dosya. Özellikle, neden -mtime +1dosyaları 48 saatten daha eski göstermediğini anlamıyorum .

Örnek bir test olarak, değişik tarihlere göre değişen üç test dosyası oluşturdum:

[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

Sonra -mtime +1anahtarla buldum ve aşağıdaki çıktıyı aldım:

[root@foobox findtest]# find -mtime +1
./foo3

Sonra bulup koştum -mmin +1440ve şu çıktıyı aldım:

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

Bulunacak man sayfasına göre, bunun beklenen bir davranış olduğunu anlıyorum:

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

Bu yine de bana mantıklı gelmiyor. Eğer bir dosya 1 gün, 23 saat, 59 dakika ve 59 saniye ise, find -mtime +1tüm bunları yok sayar ve sadece 1 gün, 0 saat, 0 dakika ve 0 saniye eski gibi davranır mı? Bu durumda, teknik olarak 1 gün eski değil ve göz ardı edilir?

Yapmaz ... hesaplamaz.


7
İlk başta bana da komik geldi, ancak tamsayı günlerinde bir dosyaların yaşını ölçtüğünü düşündüğünüzde, tam olarak beklediğiniz şeyi yapar. 1 günlük süreye eşit dosya vermez. İnt (1.99) gün eski bir dosya değil> 1
Ahtapot

Yanıtlar:


87

Basit cevap, sanırım, bulma uygulamanız POSIX / SuS standardını izliyor ve bu şekilde davranması gerektiğini söylüyor. Alıntı , "Bul" SUSv4 / IEEE Std 1003.1 2013 Sürümü :

-mtime n
     Birincil
     başlatma zamanından çıkartılan dosya değiştirme zamanının 86400'e bölünmesi (geri kalan herhangi bir tanesi atılırsa) n olup olmadığını doğru olarak değerlendirir .

(Bu belgenin herhangi bir yerinde bunun ngerçekten olabileceğini +nve bunun anlamını "daha büyük" olarak açıklar ).

Standardın neden bu şekilde davranacağını söylediğine gelince, geçmişte uzun zamandır bir programcının tembel olduğunu veya hiç düşünmediğini ve C kodunu yazdığını tahmin ediyorum (current_time - file_time) / 86400. C tamsayı aritmetiği geri kalanı atar. Bu davranışa bağlı olarak senaryolar başladı ve böylece standart hale getirildi.

Belirlenen davranış aynı zamanda yalnızca bir değişiklik tarihi (zaman değil) depolayan varsayımsal bir sisteme taşınabilir olacaktır. Böyle bir sistemin var olup olmadığını bilmiyorum.


3
Bul açıkça temizleme işleri yapmak için tasarlanmıştır.
Kjeld Flarup

84

Argüman , dosya çağındaki tüm gün-mtime sayısı olarak yorumlanır . anlamına daha sıkı büyüktür , demek kesinlikle daha az.-mtime +n-mtime -n

Bash ile daha sezgisel bir şey yapabileceğinizi unutmayın:

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

sırasıyla 24 saatten daha eski ve daha yeni dosyalar bulmak için.

( -mtimeSaat veya dakika olarak çözünürlüğü istediğiniz zamanlar için kesirli bir argüman yazmaktan daha kolaydır .)


2
Bu dosyaları insan tarafından okunabilir boyutlarda ve kronolojik sırada listelemek için (yalnızca normal) listelemek için yapın$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
Evgeni Sergeev

1
Bu aynı zamanda, bu komutların her ikisinin de 24 saat önce o bir dakika penceresindeki dosyaları hala kaçıracağı için aynı etkiye sahip olacaktır.
Ahtapot

1
$(())düz kabuk aritmetik sözdizimidir, Bash'e özgü değildir, cf. pubs.opengroup.org/onlinepubs/009695399/utilities/…
Josip Rodin

@JosipRodin Hayır, mutlaka doğru değil! This chapter describes the syntax of that command language as it is used by the sh utility and [...]. Bash, "genişletilmiş" bir SH olduğundan, bu sözdizimini destekler, ancak diğer bazı kabukları, örneğin csh / tcsh.
t0r0X

@ t0r0X, benim açımdan bunun bir faşizm olmadığı, bunun yerine kısa çizgi ve zsh olarak çalıştığı ve başka ne olursa olsun geleneksel olarak çalıştığıydı /bin/sh.
Josip Rodin,

45

Kesirli 24 saatlik süreler kesildi! Bu, “find -mtime +1” ifadesinin iki veya daha fazla gün önce değiştirilmiş dosyaları eşleştirdiğini söylüyor.

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

Aşağıdakiler yalnızca GNU’da çalışabilir mi?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago

-Mtime X -mtime farklıydı neden Teşekkürler, ben anlamaya çalışıyordum + X
Vnge

+ X'in (X + 1, X + 2, X + 3, ...) için şort anlamına geldiğini anlıyorum. :)
Eric Zheng,

18

Bir dosya 1 gün, 23 saat, 59 dakika ve 59 saniyelikse, -mtime +1 öğesinin tümünü yok sayar ve sadece 1 gün, 0 saat, 0 dakika ve 0 saniye gibi davranırsa?

Evet. Söylediği man findgibi, "herhangi bir kesirli kısım ihmal edilir". "1 gün, 23 saat, 59 dakika ve 59 saniyeyi" "24 saat" ile bölerseniz, 1.9999 alabilirsiniz, ancak .9999 bölümü daha sonra çıkarılır ve aniden dosya yalnızca 1 günlük olur.


18

-mtime NGünde A yaşı gün sayısı NA < N + 1 olan dosyaları ifade eder . Başka bir deyişle, en son N ve N +1 gün önce değiştirilmiş dosyaları seçer .-mtime N

-mtime -NYaşları dosyalar anlamına A karşılayan bir < N , yani dosyaları daha az değiştirilmiş N gün önce. Daha az sezgisel olarak, A yaşları N + 1 ≤ A'yı karşılayan , yani en az N + 1 gün önce değiştirilmiş dosyaları ifade eder .-mtime +N

Örneğin, -mtime 11 ila 2 gün önce değiştirilmiş dosyaları seçer. -mtime +1en az 2 gün önce değiştirilmiş dosyaları seçer. Dosyaların en az 1 gün önce değiştirilmesini sağlamak için kullanın -mtime +0.

“En son n * 24 saat önce değiştirildi” tanımı sadece yaklaşık bir değerdir ve net değildir.

Bu kuralları hatırlaması zor bulursanız, bunun yerine bir referans dosyası kullanın.

touch -d '1 day ago' cutoff
find . -newer cutoff

(“1 gün önce” sözdizimi GNU gerektirir touch.)


3
Güzel açıklama, ilk 3 paragrafın belgelerine eklenmelidir find!
Melebius

4

Kesin sonuç almak için -mmin, -amin, vb. Kullanın.


6
-?minArgümanlar tam gibi çalışan -?timesaat yerine gün hariç argümanlar. Onlar da “kesin” değil.
Gilles

-2

Tam 48 saat süren dosyaları istiyorsanız, 2 gün değil --daystart, findkomutunuzu eklemelisiniz . Bu sana yardım edecek.

find . type -f -daystart -mtime +1

5
Hayır, önce bu -daystart(bir GNU uzantısı), değil --daystart. O -daystartzaman, şimdiki zaman yerine zamanın bugünün başlangıcıyla karşılaştırılması anlamına gelir; bu nedenle --daystart -mtime +1, bugünün başlangıcından 48 saat / 2 saatten daha önce değiştirilmiş dosyaları rapor eder, bu nedenle genellikle dünden önceki günden önce sıkıca değiştirilen dosyaları .
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.