Saya membutuhkan solusi elegan untuk busybox (router), semua xargs atau solusi array tidak berguna bagi saya - tidak ada perintah seperti itu tersedia di sana. temukan dan mtime bukanlah jawaban yang tepat karena kita berbicara tentang 10 item dan belum tentu 10 hari. Jawaban Espo adalah yang terpendek dan terbersih dan kemungkinan yang paling tidak bertentangan.
Kesalahan dengan spasi dan ketika tidak ada file yang akan dihapus keduanya diselesaikan dengan cara standar:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Versi yang sedikit lebih edukatif: Kita bisa melakukan semuanya jika kita menggunakan awk secara berbeda. Biasanya, saya menggunakan metode ini untuk mengirimkan (mengembalikan) variabel dari awk ke sh. Seperti yang kita baca sepanjang waktu yang tidak bisa dilakukan, saya mohon berbeda: inilah caranya.
Contoh untuk file tar. Tanpa masalah tentang spasi dalam nama file. Untuk menguji, ganti "rm" dengan "ls".
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
Penjelasan:
ls -td *.tar
daftar semua file tar. Diurutkan berdasarkan waktu. Untuk menerapkan ke semua file di folder saat ini, hapus bagian "d * .tar"
awk 'NR>7...
melompati 7 baris pertama
print "rm \"" $0 "\""
membangun sebuah baris: rm "nama file"
eval
jalankan itu
Karena kita menggunakan rm
, saya tidak akan menggunakan perintah di atas dalam skrip! Penggunaan Wiser adalah:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
Dalam hal menggunakan ls -t
perintah tidak akan membahayakan contoh konyol seperti: touch 'foo " bar'
dantouch 'hello * world'
. Bukan berarti kami pernah membuat file dengan nama seperti itu di kehidupan nyata!
Sidenote. Jika kita ingin meneruskan variabel ke sh dengan cara ini, kita cukup memodifikasi cetakan (bentuk sederhana, tidak ada ruang yang ditoleransi):
print "VarName="$1
untuk mengatur variabel VarName
ke nilai $1
. Beberapa variabel dapat dibuat dalam sekali jalan. Ini VarName
menjadi variabel sh normal dan biasanya dapat digunakan dalam skrip atau shell setelahnya. Jadi, untuk membuat variabel dengan awk dan mengembalikannya ke shell:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"