จะลบไฟล์ทั้งหมดที่เก่ากว่า 3 วันเมื่อ“ รายการอาร์กิวเมนต์ยาวเกินไป” ได้อย่างไร?


89

ฉันมีไดเร็กทอรีไฟล์บันทึกที่มีไฟล์และไดเร็กทอรี 82000 ไฟล์ (ประมาณครึ่งต่อครึ่ง)

ฉันต้องการลบไฟล์และไดเรกทอรีทั้งหมดที่เก่ากว่า 3 วัน

ในไดเร็กทอรีที่มี 37000 ไฟล์อยู่ในนั้นฉันสามารถทำได้ด้วย:

find * -mtime +3 -exec rm {} \;

แต่ด้วยไฟล์ / ไดเรกทอรี 82000 ฉันได้รับข้อผิดพลาด:

/ usr / bin / find: รายการอาร์กิวเมนต์ยาวเกินไป

ฉันจะแก้ไขข้อผิดพลาดนี้ได้อย่างไรเพื่อให้ฉันสามารถลบไฟล์ / ไดเรกทอรีทั้งหมดที่เก่ากว่า 3 วันได้


1
คุณลองแล้วfind -mtime +3 -exec rm {} +หรือยัง?
Gilles Quenot

1
ฉันเชื่อว่าการวิ่งfind * -mtime +3 |xargs rmจะช่วยแก้ปัญหานั้นได้
Mats Petersson

10
find *ผมคิดว่าปัญหาเดียวก็คือ find .จะดีกว่า. เชลล์โกลว์ด้วยการขยาย*ไปยังรายการไฟล์และไดเร็กทอรีขนาดใหญ่
ไร้เสียงรบกวน

@artlessnoise เป็นจุด ๆ
sjas

คำตอบ:


120

เพื่อลบไฟล์ทั้งหมด และไดเร็กทอรีทั้งหมดภายในไดเร็กทอรีปัจจุบัน :

find . -mtime +3 | xargs rm -Rf

หรืออีกทางหนึ่งให้สอดคล้องกับคำสั่งดั้งเดิมของ OP:

find . -mtime +3 -exec rm -Rf -- {} \;

26
-1 ปัญหาคือดาวใน "find *" คุณแก้ไขได้โดยใช้ "find" แทน. Xargs ทำให้เข้าใจผิดที่นี่
Aleksandr Levchuk

7
@AleksandrLevchuk มันแก้ปัญหา OPs ได้และไม่สมควรได้รับการ
โหวตลดลง

11
คำถาม: "find * -mtime +3 -exec rm {} \;" ให้ Argument list ยาวเกินไป คำตอบ: ใช้ "find. -mtime +3 -exec rm {} \;"
Aleksandr Levchuk

2
คุณอาจต้องการเพิ่ม--หลัง rm เช่นfind . -mtime +3 -exec rm -- {} \;
domen

8
ไม่มีใครบอกว่า--มีไว้เพื่ออะไร
Acumenus

59

ยังสามารถใช้:

find . -mindepth 1 -mtime +3 -delete

เพื่อไม่ลบไดเร็กทอรีเป้าหมาย


4
คำตอบที่ดีที่สุดสะอาดกว่าโทร rm มาก (และน่าจะปลอดภัยกว่า) ใช้ได้กับไดเร็กทอรีย่อยเช่นกัน
ขั้นพื้นฐาน 6

16

อีกวิธีหนึ่งสำหรับคำถามเดิมโดยเฉพาะ มีประโยชน์หากคุณต้องการลบเฉพาะไฟล์เก่าบางไฟล์ในโฟลเดอร์จะมีลักษณะดังนี้:

find . -name "*.sess" -mtime +100 

และอื่น ๆ .. Quotes block shell wildcards จึงช่วยให้คุณ "ค้นหา" ไฟล์นับล้าน :)

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