En eski dosyayı bir klasörden kaldırmak için Bash komut dosyası


5

Eski dosyayı bir klasörden silmek için bir bash betiği yapmak istiyorum. Senaryoyu çalıştırdığım her seferinde sadece bir dosya silinecek, eski dosya. Bana bu konuda yardımcı olabilir misin? Teşekkürler


Bu makaleyi okumakta fayda var. Komutu açıklıyorls -1t | tail -n +11 | xargs rm -f
Vassilis

Yanıtlar:


9

Kos'un belirttiği gibi, en eski dosyayı bilmek mümkün olmayabilir (oluşturma tarihine göre).

Eğer değişiklik zamanı sizin için uygunsa ve dosya adında yeni bir satır yoksa:

rm "$(ls -t | tail -1)"

2

Oluşturulan en eski dosya yerine en eski değiştirilen dosyayı silmekte sorun yok gibi görünüyor;

Bunu, newlines içeren dosya adlarına bölmeyeceğinden en güvenli yöntem olarak kabul ediyorum:

stat --printf='%Y %n\0' * | sort -z | sed -zn '1s/[^ ]\{1,\} //p' | xargs -0 rm
  • stat --printf='%Y %n\0' *: geçerli çalışma dizinindeki her bir dosya için dosyanın yolunu takip eden son değişiklik zamanının NUL ayrılmış bir listesini yazdırır;
  • sort -z: satır ayırıcı olarak NUL kullanarak listeyi sıralar;
  • sed -zn '1s/[^ ]\{1,\} //p': ilk NUL sonlandırılmış satırdan boşluk bırakarak boşluk bırakmayan bir veya daha fazla karakter içeren bir dizgenin ilk oluşumunu kaldırır ve yazdırır;
  • xargs -0 rm: NUL ile sonlandırılan satırı rmargüman olarak iletir;
% touch file1
% touch file2
% stat -c '%Y %n' *            
1447318965 file1
1447318966 file2
% stat --printf='%Y %n\0' * | sort -z | sed -zn '1s/[^ ]\{1,\} //p' | xargs -0 rm 
% ls
file2

0

En eski dosyayı "Erişim Süresi" veya "Değiştirme Zamanı" na göre belirlemek için?

İkinciyse, aşağıdaki komutu kullanmanız yeterlidir:

rm  ls -l --sort=time  | sed -n 2p  | awk '{print $NF}'

Daha önce belirttiğiniz lsgibi, yaratma zamanı çekirdek tarafından desteklenmediği için çıktısı atime veya mtime olarak sıralanabilir (ve bu arada son sorulan dosyayı kaldırma yöntemi, sorunun istediği şeydir); fakat bu çoğunlukla kırılabilir 1) Çıktısında bir satırsonu içeren bir dosyada ls. Asla ayrıştırmals . Kullanın find. 2) Boşluk veya tablo içeren bir dosyada, çünkü awk '{print $NF}'yalnızca boşluk / sekmeyle ayrılmış son sözcüğü yazdırır.
kos
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.