ฉันต้องการโซลูชันที่สง่างามสำหรับ busybox (เราเตอร์) โซลูชั่น xargs หรือ array ทั้งหมดไม่มีประโยชน์กับฉัน - ไม่มีคำสั่งดังกล่าวให้ใช้งาน find และ mtime ไม่ใช่คำตอบที่ถูกต้องเนื่องจากเรากำลังพูดถึง 10 รายการและไม่จำเป็นต้อง 10 วัน คำตอบของ Espo นั้นสั้นที่สุดและสะอาดที่สุด
ข้อผิดพลาดเกี่ยวกับช่องว่างและเมื่อไม่มีไฟล์ที่จะถูกลบทั้งคู่ก็สามารถแก้ไขได้ด้วยวิธีมาตรฐาน:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Bit รุ่นทางการศึกษามากขึ้น: เราสามารถทำได้ทุกอย่างถ้าเราใช้ awk แตกต่างกัน โดยปกติฉันใช้วิธีนี้ในการส่งผ่าน (กลับ) ตัวแปรจาก awk ไปยัง sh เมื่อเราอ่านตลอดเวลาที่ไม่สามารถทำได้ฉันขอแตกต่าง: นี่คือวิธีการ
ตัวอย่างของไฟล์. tar ที่ไม่มีปัญหาเกี่ยวกับช่องว่างในชื่อไฟล์ ในการทดสอบให้แทนที่ "rm" ด้วย "ls"
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
คำอธิบาย:
ls -td *.tar
แสดงรายการไฟล์. tar ทั้งหมดที่เรียงลำดับตามเวลา หากต้องการใช้กับไฟล์ทั้งหมดในโฟลเดอร์ปัจจุบันให้ลบส่วน "d * .tar"
awk 'NR>7...
ข้าม 7 บรรทัดแรก
print "rm \"" $0 "\""
สร้างบรรทัด: rm "ชื่อไฟล์"
eval
รันมัน
เนื่องจากเรากำลังใช้rm
งานอยู่ฉันจะไม่ใช้คำสั่งด้านบนในสคริปต์! การใช้งานที่ชาญฉลาดคือ:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
ในกรณีของการใช้ls -t
คำสั่งจะไม่ทำอันตรายใด ๆ ในตัวอย่างที่โง่เช่น: และtouch 'foo " bar'
touch 'hello * world'
ไม่ใช่ว่าเราเคยสร้างไฟล์ด้วยชื่อดังกล่าวในชีวิตจริง!
sidenote หากเราต้องการส่งตัวแปรไปยัง sh ด้วยวิธีนี้เราก็จะปรับเปลี่ยนการพิมพ์ (แบบง่ายไม่มีช่องว่างยอมรับ):
print "VarName="$1
การตั้งค่าตัวแปรค่าของVarName
$1
สามารถสร้างตัวแปรหลายตัวในครั้งเดียว สิ่งนี้VarName
กลายเป็นตัวแปร sh ปกติและสามารถใช้งานได้ตามปกติในสคริปต์หรือเชลล์หลังจากนั้น ดังนั้นในการสร้างตัวแปรด้วย awk และให้กลับไปที่เชลล์:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"