X saatten eski dosyalar nasıl silinir


191

Eski dosyaları silmesi gereken bir bash betiği yazıyorum.

Şu anda kullanılarak uygulanmaktadır:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

Bu işlem 1 günden eski dosyaları silecektir.

Ancak, 1 günlük daha iyi bir çözüme ihtiyacım olursa 6 saat gibi diyelim? Bunu yapmak için güzel ve temiz bir yol var mı, bul ve -mtime kullanıyor mu?

Yanıtlar:


303

Senin mu findvar -mminseçeneğini? Bu, son değişiklikten bu yana dakika sayısını test etmenizi sağlayabilir:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

Ya da belki tmpwatchaynı işi yapmak için kullanmaya bakın . phjr ayrıca tmpreaperyorumlarda tavsiye edilir.


2
--Mmin + X kullanmak bulduklarımla birlikte tüm dosyaları döndürür. Önce bunu kontrol etmememdeki hatam, ama bu komut sadece ana dizinimin çoğunu sildi. Benim için --mmin -X doğru argüman.
brandones

tmpreaper bir tmpwatch çatalıdır. Daha güvenlidir ve dağıtımda bir debian paketi olarak bulunur. Bul -delete üzerinde faydaları: tmpreaper sembolik bağlantıları, soketleri, fifosları veya özel dosyaları kaldırmaz
Nadir

$ REQUIRED_FILES'in tırnak içinde (çift tırnak) olması gerektiğini ve şuna benzer bir desen kullanabileceğinizi belirtin: " .txt" gibi tüm .txt dosyaları veya şununla başlayan bir desenle başlayan dosyalar: "temp- " -
achasinh

@PaulDixon nasıl böylece bu değiştirme $LOCATIONve $REQUIRED_FILEShem gibi birden fazla değere sahip olabilir dir1 dir2ve *.txt *.tmp?
Enissay

@Enissay $ LOCATION tek bir dizindir. Birden fazla uzantı için muhtemelen -regex içeren bir desen kullanmak istersiniz - bkz. Stackoverflow.com/questions/5249779/…
Paul Dixon

9

Bu numaraya 1 saat önce bir dosya oluşturabilir ve -newer fileargümanı kullanabilirsiniz .

(Veya touch -tböyle bir dosya oluşturmak için kullanın ).


1
-older anahtarı yok (en azından find komutumda) ve gerekli olan şey bu. -newer yardımcı olmuyor.
iconoclast

-mmin kullanamayan makinelerde çalışacak 1 saatlik bir dosya oluşturacak bir dokunma komutu verebilir misiniz? (Linux'taysanız, -mmin kullanılabilir, eğer değilse tarih ve diğer komutlar da karşılaştırılabilir.)
iconoclast

2
@ iconconlast Her zaman 1 saatlik bir touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testdosya oluşturur test.
rovr138

4

İşte benim için işe yarayan yaklaşım (ve yukarıda kullanıldığını görmüyorum)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

klasörleri olduğu gibi bırakarak 59 dakikadan eski tüm dosyaları siler.


Tek alıntı yapmak '*.*'veya kabuk daha iyi findçözüm için bir joker olarak tutmak yerine gerçek dosya adlarına genişletir . Bu, findalt dizinlerde yinelemeli çalışmayı keser .
MestreLion

Ayrıca unutulmamalıdır ki -name '*.*'olmaz gibi hiçbir uzantılı dosya silme, README, Makefilevb
MestreLion

1

SunOS 5.10 için

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.

0

-mmin dakikadır.

Kılavuz sayfasına bakmayı deneyin.

man find

daha fazla tür için.


0

"Find" sürümünüzde "-mmin" yoksa, "-mtime -0.041667", "son bir saat içinde" oldukça yakınlaşır, bu durumda, şunu kullanın:

-mtime +(X * 0.041667)

yani X 6 saat demekse, o zaman:

find . -mtime +0.25 -ls

çünkü çalışır 24 saat * 0.25 = 6 saat


Bu eski UNIX'in -mmin'i olmadığı için umut vericiydi, ancak ne yazık ki bu eski UNIX'in mtime için kesirli değerleri sevmediği için hiç de yardımcı değil: find: -mtime argümanı -2147483647 aralığında bir tamsayı olmalı 2147483647
kbulgrien

0

Burada kimse onların içinde merak ediyordum @iconoclast yolda gidiş için yapabileceklerini olduğu comment başka yanıta.

kullanıcı için crontab veya bir /etc/crontabdosya oluşturmak için /tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

ve ardından komutunuzu çalıştırmak için bunu kullanın:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

*/1Çünkü saatte crontab'ınızda gereksizdir. Saat alanına * koymakla aynı şey.
colm.anseo

0

find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;


0

Eğer bir kişi findyoksa -mminve biri findiçin sadece tamsayı değerlerini kabul eden bir ile sıkışmışsa -mtime, o zaman biri "daha eski" nin "daha yeni değil" e benzediğini düşünürse, her şey mutlaka kaybolmaz.

Kesme zamanımızın bir zamanı findolan bir dosya oluşturabilirsek, referans dosyamızdan "daha yeni olmayan" dosyaları bulmamızı isteyebiliriz .

Doğru zaman damgası olan bir dosya oluşturmak için yeterli olmayan bir sistem nedeniyle ilgili biraz findbelki de daha az-daha-yetenekli sahiptir dategibi şeyler yapabilirdi komutu: date +%Y%m%d%H%M%S -d "6 hours ago".

Neyse ki, bunu daha kötü bir şekilde de olsa, bunu yönetebilen diğer eski araçlar.

Altı saatin 21600 saniye olduğunu düşünün. Altı saat önceki zamanı faydalı bir biçimde bulmak istiyoruz:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

Perl ifadesi yararlı bir tarih üretti, ancak daha iyi kullanılmalıdır:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

Şimdi bu eski UNIX'in çözümü şu konularda:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

Referans dosyamızı temizlemek de iyi bir fikir olabilir ...

$ rm -f ref_file
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.