ลบไฟล์ที่เก่ากว่าไฟล์ที่ระบุ


14

ฉันจำเป็นต้องลบไฟล์ทั้งหมดที่เก่ากว่าไฟล์เฉพาะจากโฟลเดอร์
ใช้ bash บน CentOS 7

ฉันมีทางออกสำหรับสิ่งนี้ แต่ฉันคิดว่าควรมีวิธีที่หรูหรากว่านี้:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

คำตอบ:


28

ฉันไม่ได้ลอง แต่findควรจะสามารถจัดการการดำเนินการทั้งหมดได้ดี:

$ find dir/ -type f ! -newer reference -delete

... หรือ...

$ find dir/ -type f ! -newer reference ! -name reference -delete

โดยทั่วไป:

  • ! -newer referencereferenceตรงกับไฟล์ที่ได้รับการแก้ไขน้อยกว่าเมื่อเร็ว ๆ นี้
  • -delete ลบพวกเขา
  • ! -name referenceไม่รวมreferenceในกรณีที่ตั้งอยู่ด้านล่างdir/และคุณต้องการเก็บไว้

นี้ควรลบไฟล์ทั้งหมดที่มีอายุมากกว่าและอยู่ภายใต้referencedir/


2
สมบูรณ์แบบ :) เพิ่งเพิ่ม-maxdepth 1เพื่อไม่ให้เกิดการค้นหาซ้ำ
csny

3
! -newerหมายถึง "ไม่ใหม่" ดังนั้น "เก่ากว่าหรืออายุเท่ากัน "; ไฟล์นั้นจะถูกจับคู่ถ้ามันอยู่ในพา ธfindดูสิ่งที่ต้องจำไว้
ferada

1
@ferada มันจะไม่เกิดขึ้นถ้าคุณแยกออกซึ่งเป็นสาเหตุที่คำตอบของฉันรวมอยู่ด้วย! -name reference(ดูหัวข้อย่อยที่สาม)
John WH Smith

7

เปรียบเทียบเวลาของการแก้ไขไฟล์ที่มีtestการใช้-nt(ใหม่กว่า) และ-ot(เก่ากว่า) ผู้ประกอบการ:

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi

2
ขอบคุณนั่นดีกว่าโซลูชันของฉัน แต่คุณยังคงต้องวนซ้ำไฟล์ทั้งหมดในโฟลเดอร์และเปรียบเทียบ ... คำตอบอื่น ๆ ที่สวยงามยิ่งขึ้น
csny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.