Linux: <date> 'dan daha eski dosyaları bulmak için find komutunu kullanmak


31

findX günden daha az değiştirilmiş dosyaları bulmak için iyi desteği var, ancak findbelirli bir tarihten sonra değiştirilen tüm dosyaları bulmak için nasıl kullanabilirim ?

Bunu findyapmak için man sayfasında hiçbir şey bulamıyorum , yalnızca başka bir dosya zamanıyla karşılaştırmak ya da oluşturulan zaman ile şimdi arasındaki farkları kontrol etmek için. İstenilen zamana sahip bir dosya yapmak ve bunu yapmanın tek yolu ile karşılaştırmak mı?


1
Bu daha iyi SuperUser.com üzerinde sorulur
Josh Brower

6
Bunu kapatmayacağım: sysadmins için de ilginç olabilir.
splattne

Komut, gece yedeklemelerinde kurulum sonrası değiştirilen / etc öğesinden her şeyi alan bir yedekleme komut dosyasının bir kısmı içindir.
DrStalker

Dokuz yaşında ve yeni bir cevap yönetirken yeni farkettim: Bu sorunun başlığı ve gövdesi aynı değildir. Başlık '<date>' dan daha eski olan ancak “belirli bir tarihten sonra değiştirilmiş olan” durumları istiyor 'Sonrası' olanını daha eski değil, belirli bir tarihten daha yeni olarak yorumluyorum.
Joffrey

Yanıtlar:


19

Yalnızca '-newer dosyanız' varsa, bu geçici çözümü alabilirsiniz:

touch -t 201003160120 some_file
find . -newer some_file

adam dokunuş:

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

Dokunuşunuzun bu seçeneğe sahip olduğunu varsayarsak (benimki dokunuş 5.97'dir).


48

Hayır, tarih / saat dizesini kullanabilirsiniz.

Kimden man find:

-newerXY başvuru
Geçerli dosyanın zaman damgasını başvuru ile karşılaştırır. Referans argümanı normalde bir dosyanın adıdır (ve karşılaştırma için zaman damgalarından biri kullanılır), fakat aynı zamanda mutlak bir zamanı tanımlayan bir dize de olabilir. X ve Y, diğer harfler için yer tutucudur ve bu harfler, karşılaştırma için referansın nasıl kullanıldığına ait zamanı seçerler.

          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

Örnek:

find -newermt "mar 03, 2010" -ls
find -newermt yesterday -ls
find -newermt "mar 03, 2010 09:00" -not -newermt "mar 11, 2010" -ls

5
GNU bulma sürüm 4.2.27'yi kullanan Centos 5.2 kullanıyorum ve -newermt veya "-newer file" dışındaki herhangi bir -newer parametresini desteklemiyor
DrStalker 16.06

1
GNU bulguları 4.3.3 ve daha yeni sürümleri savannah.gnu.org/bugs/?11668'e
Philip Durbin

25

Doğrudan soru ile ilgili değil, ancak burada yanılmak bazı kişiler için ilginç olabilir.

find komutu, gerekli tarihlerden daha eski olan dosyaları bulmak için -older parametresini doğrudan desteklemiyor, ancak negate deyimini kullanabilirsiniz (kabul edilen cevap örneğini kullanarak):

touch -t 201003160120 some_file
find . ! -newer some_file

belirtilen tarihten daha eski dosyaları döndürür .


3
editörler - belki de kabul edilmiş cevaplarla birleştirilmelidir?
nEJC

bu çözüm bu tür sorunları çözmenin en şık yoludur :)
Labynocle

9
find <dir> -mtime -20

bu find komutu son 20 gün içinde değiştirilen dosyaları bulacaktır.

  • mtime -> modifiye (atime = erişildi, ctime = oluşturuldu)
  • -20 -> 20 günden daha eski (20 tam 20 gün, +20 20 günden fazla)

Gibi ek sınırlamalar eklemek acan:

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

öncekiyle aynı, ancak sadece '.txt' ile biten dosyaları bulur.


5

Sadece eklemek için - bir zaman aralığında arama yapmak için iki newermt argümanı bile kullanabilirsiniz:

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

tüm dosyaları Mart 2007’den bulmak için.


1

Böyle bir betiği kullanabilirsiniz

#!/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'nize "newerthan" olarak kaydedin ve çalıştırılabilir hale getirin.

Sonra böyle bir tarihten sonra değiştirilmiş dosyayı bulabilirsiniz:

newerthan "2010-03-10"

veya

newerthan "last year"

veya

newerthan "yesterday"

Bu istediğini yapmalı. Aksi takdirde bunu başarmanın bir yolu olduğunu sanmıyorum.


bcTamsayılı matematik için kullanmak gerekli değildir , Bash bunu yapabilir: ((seconds = when - now))format argümanı datebir artıya sahip olmalı date +%sve bazı sistemler olmayabilirdate -d
sonraki bildirime kadar duraklatıldı.

Bu Centos 5.2 için. Hangi -d var. Olsa tamsayı matematik hakkında bilmek yararlı.
Richard Holloway

1
find ! -newermt “<DATE>”

bunun gibi:

find ! -newermt “jan 01 2015” 

Bu, geçerli dizinde 01-01-2015'den daha eski dosyaları verecektir.

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


Sizi ServerFault'da karşılayan bir yorum yazmak üzereydim ve sizden soru başlığını ve vücudunun farklı şeyler söyleyene kadar yinelenen bir cevap vermeyi tekrar gözden geçirmenizi rica ediyorum: başlık '<date>' dan daha eski dosyalar ve soru durumları 'değiştirildi Belli bir tarihten sonra, ki bence iki farklı şey var. Belki de gönderinizdeki farkı açıklığa kavuşturup olumsuzun kullanımını açıklayabilirsiniz. Katkıda bulunduğunuz için teşekkür ederiz ve açıklama için soru ile ilgili bir yorum göndereceğim. Katkıda bulunduğunuz için teşekkür ederiz!
Joffrey

0

Tarihiniz karşılaştırma için uygun olacak şekilde biçimlendirilmişse,

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