ลบไฟล์ที่เก่ากว่า 7 วัน


79

ฉันเขียนคำสั่งด้านล่างเพื่อลบไฟล์ทั้งหมดที่เก่ากว่า 7 วัน แต่มันไม่ทำงาน:

find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

ฉันจะลบไฟล์เหล่านี้ได้อย่างไร


5
ควรจะมีช่องว่างระหว่างและname '*.gz'
Jos

คำตอบ:


136

ในฐานะที่เป็น @Jos ชี้ให้คุณพลาดช่องว่างระหว่างnameและ'*.gz'; นอกจากนี้สำหรับการเร่ง-type fตัวเลือกการใช้คำสั่งเพื่อเรียกใช้คำสั่งบนf iles เท่านั้น

ดังนั้นคำสั่งคงที่จะเป็น:

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

คำอธิบาย:

  • find: คำสั่ง unix สำหรับค้นหาf iles / d irectories / l inks และอื่น ๆ
  • /path/to/: ไดเรกทอรีเพื่อเริ่มการค้นหาของคุณ
  • -type f: ค้นหาไฟล์เท่านั้น
  • -name '*.gz': .gzแฟ้มรายชื่อที่ลงท้ายด้วย
  • -mtime +7: พิจารณาเฉพาะสิ่งที่มีเวลาแก้ไขที่เก่ากว่า 7 วัน
  • -execdir ... \;: ...สำหรับแต่ละผลดังกล่าวพบทำคำสั่งต่อไปใน
  • rm -- '{}': ลบไฟล์; {}ส่วนหนึ่งคือการที่ผลการค้นหาที่ได้รับการทดแทนเข้าจากส่วนก่อนหน้านี้ --หมายถึงจุดสิ้นสุดของพารามิเตอร์คำสั่งหลีกเลี่ยงการแจ้งข้อผิดพลาดสำหรับไฟล์เหล่านั้นที่เริ่มต้นด้วยเครื่องหมายขีดกลาง

หรือใช้:

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

จากคนค้นหา :

-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

ซึ่งมีประสิทธิภาพมากกว่านี้เล็กน้อยเนื่องจากเป็น:

rm file1 file2 file3 ...

ตรงข้ามกับ:

rm file1; rm file2; rm file3; ...

ตาม-execวิธีการ


ทางเลือกและคำสั่งที่เร็วกว่านั้นกำลังใช้+terminator ของ exec แทน\; :

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

คำสั่งนี้จะทำงานrmเพียงครั้งเดียวในตอนท้ายแทนทุกครั้งที่พบไฟล์และคำสั่งนี้เกือบจะเร็วเท่ากับการใช้-deleteตัวเลือกดังต่อไปนี้ในโมเดิร์นfind:

find /path/to/ -type f -mtime +7 -name '*.gz' -delete

3
ทำไมฉันจะไม่พูด-deleteจบด้วยล่ะ? ทำไมยุ่งกับ+หรือ\;?
rain01


2

ระวังการลบไฟล์ด้วยการค้นหา รันคำสั่งด้วย -ls เพื่อตรวจสอบสิ่งที่คุณกำลังลบ

find /media/bkfolder/ -mtime +7 -name '*.gz' -ls . จากนั้นดึงคำสั่งขึ้นมาจากประวัติและต่อท้าย-exec rm {} \;

จำกัดความเสียหายที่คำสั่ง find สามารถทำได้ หากคุณต้องการที่จะลบไฟล์จากเพียงหนึ่งไดเรกทอรี-maxdepth 1ป้องกันไม่ให้พบจากการเดินผ่านไดเรกทอรีย่อยหรือจากการค้นหาระบบเต็มถ้าคุณ /media/bkfolder /typo

ข้อ จำกัด อื่น ๆ ที่ฉันเพิ่มเป็นข้อโต้แย้งชื่อที่เฉพาะเจาะจงเช่น-name 'wncw*.gz'การเพิ่มเวลาที่ใหม่กว่า -mtime -31และการอ้างอิงไดเรกทอรีที่ค้นหา สิ่งเหล่านี้มีความสำคัญอย่างยิ่งหากคุณทำการล้างข้อมูลโดยอัตโนมัติ

find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

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