Belirli bir tarihten önce oluşturulan tüm dosyaları kaldırın


26

Çok sayıda dosya içeren bir dizine sahibim (yılın her günü için günlükler gibi). Diyelim ki 22/11 diyelim önce oluşturulan tüm dosyaları kaldırmak istiyorum. Bunu nasıl başarabilirim? Sonra kullanmalı mıyım findexec -rm? Ksh kullanıyorum.


1
Genel uyarı, Unix dosya sistemlerinin genellikle dosyanın ne zaman oluşturulduğunun kaydını içermemesidir - yalnızca inode ve içeriğin en son değiştirildiği zamanlar kullanılabilir.
Toby Speight

Yanıtlar:


35

Kullanım findhala dosyaları silmenin tercih edilen yoludur. Daha fazla bilgi için http://mywiki.wooledge.org/UsingFind adresine bakın .

Bunu yapmanın bir yolu içinde zaman damgalı bir dosya oluşturmaktır. Örneğin

touch -t 201311220000 /tmp/timestamp

Şimdi find, zaman damgasıyla eşleşen örneğin geçerli dizinde olduğu varsayılarak GNU dosyalarını silin :

find . -type f ! -newer /tmp/timestamp -delete  

veya GNU olmayanlar bulmak

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
Peki buna ne dersin ? Çalışıyor mu ? -tip f tipi -mtime +5 -exec rm -f {} \;
user1058398

1
@ user1058398 Bu, 5 günden daha eski olan dosyaları siler.
Valentin Bajrami

Ayrıca dosyalarla birlikte klasörü de siliyor mu? @ val0x00ff
alper

1
@Avatar no, çünkü type -fişlemi yalnızca dosyalara sınırlar.
Valentin Bajrami

22

GNU veya bazı BSD'ler ile find:

find . ! -newermt 2013-11-22 ! -type d -delete

Dosyaların son değişiklik zamanını kontrol ettiğini unutmayın. Bazı BSD, kullanmak olabilir -newerBtyerine -newermtdosyanın düğüm kontrol etmek doğum yerine varsa zaman.


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

örnek:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

Bu durumda, "ORA_XEO" ile başlayan ve 15 günden fazla olan tüm dosyaları kaldıracaktır.


rm -rfİlk komut, daha iyi izlese de , ilk komut bu 15 günden daha eski olan herhangi bir dizinde bulunan her şeyi kaldıracaktı. (Ayrıca, neden parantez çevresinde -name?)
ilkkachu

Haklısın, "(" ")" koymamız gerekmez.
calafate

ancak bir koşul eklemek istiyorsak, yararlı olabilir. örneğin, ".jar" veya ".cp" ile biten tüm dosyaları kaldırmak ve "ex" ile başlamak istiyorsak. example.jar- kaldırılacak example.cp- kaldırılacak example.tar- kaldırılmayacak
calafate

bu durumda şunları kullanabiliriz:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
calafate

Yani bazı dosyaları kaldıracaktır <gün sayısı> yerine eski tüm dosyaların daha <gün sayısı> Eğer gece yarısı tam çalıştırmak ve bir saniye içinde bitirir sürece. GNU ile , değeri gece yarısına zorlamak için değiştiriciyi findkullanmalısınız . -daystart-mtime
roaima
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.