Tôi cần một giải pháp tao nhã cho busybox (bộ định tuyến), tất cả các giải pháp xargs hoặc mảng đều vô dụng đối với tôi - không có lệnh nào như vậy có sẵn ở đó. tìm và mtime không phải là câu trả lời thích hợp vì chúng ta đang nói về 10 mục và không nhất thiết là 10 ngày. Câu trả lời của Espo là câu trả lời ngắn gọn và sạch nhất và có khả năng nhất.
Lỗi với khoảng trắng và khi không có tệp nào bị xóa, cả hai đều được giải quyết theo cách tiêu chuẩn:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Phiên bản giáo dục hơn một chút: Chúng tôi có thể làm tất cả nếu chúng tôi sử dụng awk khác nhau. Thông thường, tôi sử dụng phương thức này để truyền (trả về) các biến từ awk sang sh. Khi chúng ta đọc tất cả thời gian không thể thực hiện được, tôi xin khác: đây là phương pháp.
Ví dụ cho các tệp .tar không có vấn đề liên quan đến khoảng trắng trong tên tệp. Để kiểm tra, thay thế "rm" bằng "ls".
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
Giải trình:
ls -td *.tar
liệt kê tất cả các tập tin .tar được sắp xếp theo thời gian. Để áp dụng cho tất cả các tệp trong thư mục hiện tại, hãy xóa phần "d * .tar"
awk 'NR>7...
bỏ qua 7 dòng đầu tiên
print "rm \"" $0 "\""
xây dựng một dòng: rm "tên tệp"
eval
thực hiện nó
Vì chúng tôi đang sử dụng rm
, tôi sẽ không sử dụng lệnh trên trong một tập lệnh! Cách sử dụng khôn ngoan là:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
Trong trường hợp sử dụng ls -t
lệnh sẽ không gây hại gì cho các ví dụ ngớ ngẩn như: touch 'foo " bar'
và touch 'hello * world'
. Không phải là chúng ta từng tạo ra những tập tin có tên như vậy trong đời thực!
Sidenote. Nếu chúng ta muốn truyền một biến cho sh theo cách này, chúng ta chỉ cần sửa đổi bản in (dạng đơn giản, không dung sai khoảng trắng):
print "VarName="$1
để đặt biến VarName
thành giá trị của $1
. Nhiều biến có thể được tạo trong một lần. Điều này VarName
trở thành một biến sh bình thường và có thể được sử dụng bình thường trong một tập lệnh hoặc shell sau đó. Vì vậy, để tạo các biến với awk và đưa chúng trở lại trình bao:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"