Meşgul kutusu (yönlendirici) için zarif bir çözüme ihtiyacım vardı, tüm xargs veya dizi çözümleri benim için işe yaramazdı - böyle bir komut yok. find ve mtime, 10 madde ve mutlaka 10 gün hakkında konuştuğumuzdan uygun cevap değildir. Espo'nun cevabı en kısa ve en temiz ve muhtemelen en çılgınca cevaptı.
Boşluklarda hata ve hiçbir dosya silinmeyeceği zaman standart yolla çözülür:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Biraz daha eğitici versiyon: awk'ı farklı kullanırsak hepsini yapabiliriz. Normalde, awk den sh değişkenleri (return) geçirmek için bu yöntemi kullanın. Her zaman okunamayacağımız gibi, farklı olmaya yalvarıyorum: İşte yöntem.
Dosya adındaki boşluklarla ilgili sorun olmayan .tar dosyalarına örnek. Test etmek için, "rm" yerine "ls" yazın.
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
Açıklama:
ls -td *.tar
zamana göre sıralanmış tüm .tar dosyalarını listeler. Geçerli klasördeki tüm dosyalara uygulamak için "d * .tar" bölümünü kaldırın
awk 'NR>7...
ilk 7 satırı atlar
print "rm \"" $0 "\""
bir satır oluşturur: rm "dosya adı"
eval
yürütür
Kullandığımız rm
için yukarıdaki komutu bir komut dosyasında kullanmam! Daha akıllı kullanım:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
ls -t
Komutun kullanılması durumunda , aşağıdaki gibi aptal örneklere herhangi bir zarar vermez: touch 'foo " bar'
vetouch 'hello * world'
. Gerçek hayatta böyle isimlere sahip dosyalar yarattığımızdan değil!
Kenar notu. Sh değişkenine bu şekilde geçmek istersek, baskıyı basitçe değiştirirdik (basit form, tolere edilen boşluk yok):
print "VarName="$1
değişkeni VarName
değerine ayarlamak için $1
. Tek seferde birden çok değişken oluşturulabilir. Bu VarName
normal bir sh değişkeni haline gelir ve normalde daha sonra bir kodda veya kabukta kullanılabilir. Yani, awk ile değişkenler oluşturmak ve bunları kabuğa geri vermek için:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"