Bash script เพื่อลบไฟล์ที่เก่ากว่า x วันด้วยไดเรกทอรีย่อย


37

ฉันพยายามลบไฟล์ที่เก่ากว่า x วัน

ตอนนี้ฉันมีสคริปต์ที่จะทำเช่นนั้น

find /path/to/files* -mtime +10 -exec rm {} \; 

แต่สิ่งนี้จะลบไดเรกทอรีย่อยด้วย มีโฟลเดอร์มากมาย แต่ฉันต้องการเก็บไว้และลบไฟล์ที่เก่ากว่า 10 วันภายในโฟลเดอร์ดังกล่าว

มีวิธีทำเช่นนี้หรือไม่?

คำตอบ:


50

type ตัวเลือกสำหรับการกรองผลลัพธ์

findยอมรับtypeตัวเลือกสำหรับการเลือกเช่นไฟล์เท่านั้น

find /path/to/files -type f -mtime +10 -delete

ออก-deleteไปแสดงสิ่งที่มันจะลบและเมื่อคุณตรวจสอบแล้วไปข้างหน้าและเรียกใช้คำสั่งเต็ม

ที่จะทำงานกับไฟล์เท่านั้นไม่ใช่ไดเรกทอรี ใช้-type dสำหรับผกผันเฉพาะรายการไดเรกทอรีที่ตรงกับข้อโต้แย้งของคุณ


ตัวเลือกเพิ่มเติม

คุณอาจต้องการอ่านman findเนื่องจากมีตัวเลือกเพิ่มเติมที่คุณอาจต้องการในอนาคต ตัวอย่างเช่น-maxdepthจะช่วยให้คุณสามารถ จำกัด เฉพาะรายการที่พบในระดับความลึกที่เฉพาะเจาะจงเช่น-maxdepth 0จะไม่เรียกเก็บเงินในไดเรกทอรีย่อย

ข้อสังเกตบางส่วน

  • ฉันสงสัยว่าคำสั่งจะลบโฟลเดอร์ได้อย่างไรเนื่องจากคุณไม่สามารถลบโฟลเดอร์ได้rmอย่างเดียว คุณต้องการrm -rสิ่งนั้น

  • นอกจากนี้ยัง/path/to/files*สับสน คุณหมายถึง/path/to/files/หรือคุณคาดหวังว่าไวด์การ์ดจะขยายไปยังชื่อไฟล์และโฟลเดอร์หลายชื่อหรือไม่?

  • ใส่{}เครื่องหมายอัญประกาศเดี่ยวคือ'{}'เพื่อหลีกเลี่ยงชื่อไฟล์ / ไดเรกทอรีที่ถูกแทนที่โดยเชลล์ที่ถูกตีความเช่นเดียวกับที่เราป้องกันเครื่องหมายอัฒภาคด้วยแบ็กสแลช


มีหลายโฟลเดอร์ภายใน / path / to / files / จริง ๆ แล้วฉันต้องการเรียกใช้ mtime +10 -exec rm ไปยังแต่ละโฟลเดอร์เหล่านั้น แต่เก็บโฟลเดอร์ของตัวเองโดยทั่วไปฉันต้องการบรรลุคือลบทั้งหมด ไฟล์เก่ากว่า 10 วันและเก็บโฟลเดอร์ทั้งหมด ฉันเป็นคนใหม่เกี่ยวกับการแข่งขันขอโทษที่ newbness :)
JoyIan Yee-Hernandez

คุณไปแล้ว :) แค่ทำfind /path/to/files* -type f -mtime +10แล้วดูว่ามันจะออกมาอะไร
slhck

ใช่เมื่อมีข้อสงสัยอย่าทำ-execเพียงดูสิ่งที่พบก่อน
Rob

2
@ JoyIanYee-Hernandez นอกจากนี้คุณยังสามารถใช้-deleteอาร์กิวเมนต์เพื่อfindลบไฟล์และโฟลเดอร์ทั้งหมดหากว่าว่างเปล่า มันหมายถึง-depthคือการค้นหาความลึกครั้งแรก
Daniel Beck

1
@Kreker จากนั้นคุณต้องเพิ่ม-mindepth 1เพื่อแยกไดเรกทอรีหลัก
slhck

5

เช่นเดียวกับในคำตอบก่อนหน้า (+1 สำหรับทั้งคู่) เคล็ดลับคือการใช้เพ-type fรดิเคต

โปรดทราบว่า-exec rm '{}'คุณสามารถใช้เพรดิเคต-deleteแทนได้ แต่อย่าทำอย่างนั้น ด้วย-exec rm '{}'คุณสามารถ (และควร) ทำก่อน-exec echo rm '{}'เพื่อยืนยันว่านี่คือสิ่งที่คุณต้องการจริงๆ echoหลังจากนั้นรันคำสั่งโดยไม่ต้อง

การใช้-deleteเร็วกว่า (ไม่มีการเพิ่มfork()และexecve()สำหรับแต่ละไฟล์) แต่สิ่งนี้มีความเสี่ยงเนื่องจากการ-deleteทำงานเป็นเงื่อนไขดังนั้น:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

แต่ถ้าคุณแลกเปลี่ยนอาร์กิวเมนต์เท่านั้น:

# delete ALL files
find . -type f -name '*.tmp' -delete

หากคุณต้องการfindและrmทำงานได้เร็วขึ้นสำหรับไฟล์จำนวนมากลองใช้find ... | xargs ... rmสำนวน UNIX


4
ฉันคิดว่าตัวอย่างสองตัวอย่างสุดท้ายของคุณเหมือนกันอาจต้องการแก้ไข!
slhck


1

ฉันพยายามที่จะทำให้ถูกต้องโดยใช้สคริปต์ที่ให้ไว้ข้างต้นและสคริปต์อื่น ๆ โดยเฉพาะเมื่อไฟล์และชื่อโฟลเดอร์มีการขึ้นบรรทัดใหม่หรือช่องว่าง

ในที่สุดก็สะดุดกับ tmpreaper และมันก็ใช้งานได้ดีสำหรับเราจนถึงตอนนี้

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

ลิงค์ต้นฉบับ

มีคุณสมบัติเช่นการทดสอบซึ่งตรวจสอบไดเรกทอรีซ้ำและรายการพวกเขา ความสามารถในการลบ symlink ไฟล์หรือไดเรกทอรีและโหมดการป้องกันสำหรับรูปแบบบางอย่างในขณะที่ลบ


0

เพื่อเพิ่มความเร็วในการใช้คำสั่ง'+'แทน\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

การดำเนินการนี้จะทำงานrmเพียงครั้งเดียวในตอนท้ายแทนที่จะเป็นทุกครั้งที่พบไฟล์
( rmอาจถูกเรียกใช้หลายครั้งหากไฟล์ของคุณมีจำนวนมากจริง ๆ เนื่องจากข้อจำกัดความยาวบรรทัดคำสั่ง แต่นี่ก็ยังเร็วเท่ากับการใช้-delete)


0

rm -f find /path/to/files -type file -mtime -5

นี่จะเป็นการลบไฟล์ที่ถูกแก้ไขภายใน 5 วัน

rm -f find /path/to/files -type file -mtime +5

นี่จะเป็นการลบไฟล์ที่ถูกแก้ไขก่อนหน้า 5 วัน

ใช้ `ก่อนค้นหาและสิ้นสุดหลังจาก 5

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