ลบไฟล์ที่เก่ากว่า X days +


143

ฉันพบคำสั่งเพื่อลบไฟล์ที่เก่ากว่า 5 วันในโฟลเดอร์

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

แต่ฉันจะทำเช่นนี้สำหรับไดเรกทอรีย่อยในโฟลเดอร์นั้นได้อย่างไร


คุณหมายถึงไฟล์ภายในไดเรกทอรีย่อยหรือไม่? หรือไดเรกทอรีย่อยเอง?
ราหุล

3
find /path/to -type d -empty -delete
Costas

2
ลบไฟล์ในไดเรกทอรีย่อยที่มีอายุมากกว่า 5+ วันด้วย
Teddy291

3
อาจสนุกเมื่อฉันมีไฟล์ที่มีช่องว่าง เช่นไฟล์ที่เรียกว่า "การทดสอบหนึ่ง" rm test oneและได้รับการเลี้ยงดู (ซึ่งจะลบไฟล์ชื่อ "test" และไฟล์ชื่อ "one" แต่ไม่ใช่ไฟล์ที่เรียกว่า "test one") คำแนะนำ: -delete หรือ -print0
Hennes

6
ในฐานะที่เป็นบันทึกด้านข้างเสมออ้างอาร์กิวเมนต์ที่จัดทำโดยfindเพื่อหลีกเลี่ยงปัญหากับตัวอักษรพิเศษตามที่กล่าวไว้ในบรรทัดแรกของคำตอบ เช่น:find /path/to/files/ -exec somecommand '{}' \;
Walf

คำตอบ:


240

ระวังด้วยชื่อไฟล์พิเศษ (ช่องว่างอัญประกาศ) เมื่อไพพ์ถึง rm

มีทางเลือกที่ปลอดภัย - ตัวเลือก-delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

นั่นแหล่ะไม่มีการเรียก rm แยกต่างหากและคุณไม่ต้องกังวลเกี่ยวกับชื่อไฟล์

แทนที่-deleteด้วย-depth -printเพื่อทดสอบคำสั่งนี้ก่อนที่คุณจะเรียกใช้ (โดย-deleteนัย-depth)


23
ใช้-type fเพื่อลบไฟล์เท่านั้น (และเก็บไดเรกทอรีย่อย)
Oleg

3
หรือถ้าคุณต้องการทำเช่นเดียวกันสำหรับไฟล์ทั้งหมดใหม่กว่าห้าวัน: find / path / to / directory / -mindepth 1 -mtime -5 -delete
zmonteca

หากเส้นทางของฉันมีช่องว่างฉันควรทำอย่างไร find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio

3
@ uom-pgregorio ฉันขอแนะนำให้วางเส้นทางในเครื่องหมายคำพูด
atripes

4
โปรดทราบว่าทุกfindอาร์กิวเมนต์เป็นตัวกรองที่ใช้ผลลัพธ์ของตัวกรองก่อนหน้าเป็นอินพุต ดังนั้นให้แน่ใจว่าคุณเพิ่ม -delete เป็นอาร์กิวเมนต์สุดท้าย IE: find . -delete -mtime +5จะลบทุกอย่างในเส้นทางปัจจุบัน
Johan

15

โปรดทราบว่าคำสั่งนี้จะไม่ทำงานเมื่อพบไฟล์มากเกินไป มันจะให้ข้อผิดพลาดเช่น:

bash: /usr/bin/find: Argument list too long

ความหมายเกินขีด จำกัด ของการเรียกระบบ exec บนความยาวของบรรทัดคำสั่งเกิน แทนการดำเนิน RM ว่าวิธีการมันมากมีประสิทธิภาพมากขึ้นในการใช้xargs นี่คือตัวอย่างที่ใช้งานได้:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

การดำเนินการนี้จะลบไฟล์ทั้งหมด (ประเภท f) ที่แก้ไขนานกว่า 14 วันที่ผ่านมาภายใต้ / root / Maildir / เรียกซ้ำจากที่นั่นและลึกลงไป (ความลึก 1) ดูคู่มือการค้นหาสำหรับตัวเลือกเพิ่มเติม


7
คำตอบต่อ @ AfshinHamedi ของ AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ต่อวัน ) ระวังไฟล์ที่มีบรรทัดใหม่และอักขระพิเศษ ใช้แทนfind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe

2
หรือเพียงเพิ่ม '+' ในผลลัพธ์การค้นหา
Dani_l

8

มันเหมือนกัน. คุณเพียงแค่ต้องให้ไดเรกทอรีหลักมากกว่าคำนำหน้าของไฟล์ ในตัวอย่างของคุณมันจะเป็น:

find /path/to -type f -mtime +5 -exec rm {} \;

การดำเนินการนี้จะลบไฟล์ทั้งหมดที่เก่ากว่า 5 วันซึ่งอยู่ภายใต้/path/toและไดเรกทอรีย่อย

หากต้องการลบไดเรกทอรีย่อยที่ว่างเปล่าให้อ้างถึงความคิดเห็น @Costas ด้านบน


4
โปรดทราบว่าสำหรับแต่ละไฟล์และทุกไฟล์คุณจะดำเนินการคำสั่ง rm หากคุณมี 1,000 ไฟล์ที่เก่ากว่า 5 วัน rm จะเริ่มต้น 1,000 ครั้ง ด้วยเหตุนี้ให้พิจารณาตัวเลือก -delete เช่นเดียวกับในความคิดเห็นของ Costa หรือ -exec rm {} \ +
Hennes

@Hennes: - 1) ไม่แน่ใจว่าคุณต้องหลบหนี+ในกรณีนั้น - 2) ดีกว่าที่จะเขียน-exec rm '{}' +เพื่อป้องกันความชั่วร้ายของไฟล์ที่มีอักขระพิเศษ (ช่องว่างการขึ้นบรรทัดใหม่ ฯลฯ ... ) ในชื่อของพวกเขา
Cbhihe

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