ฉันมีไดเรกทอรีชื่อเป็น:
2012-12-12
2012-10-12
2012-08-08
ฉันจะลบไดเรกทอรีที่เก่ากว่า 10 วันด้วย bash shell script ได้อย่างไร
ctime
เป็นเวลาเปลี่ยนแปลง inode สำหรับไดเรกทอรีมันจะเปลี่ยนเมื่อไฟล์ถูกเพิ่มหรือลบออกจากไดเรกทอรี
ฉันมีไดเรกทอรีชื่อเป็น:
2012-12-12
2012-10-12
2012-08-08
ฉันจะลบไดเรกทอรีที่เก่ากว่า 10 วันด้วย bash shell script ได้อย่างไร
ctime
เป็นเวลาเปลี่ยนแปลง inode สำหรับไดเรกทอรีมันจะเปลี่ยนเมื่อไฟล์ถูกเพิ่มหรือลบออกจากไดเรกทอรี
คำตอบ:
สิ่งนี้จะทำซ้ำเพื่อคุณ:
find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;
คำอธิบาย:
find
: คำสั่ง unix สำหรับค้นหาไฟล์ / ไดเรกทอรี่ / ลิงก์เป็นต้น/path/to/base/dir
: ไดเรกทอรีเพื่อเริ่มการค้นหาของคุณ-type d
: ค้นหาเฉพาะไดเรกทอรี-ctime +10
: พิจารณาเฉพาะสิ่งที่มีเวลาแก้ไขที่เก่ากว่า 10 วัน-exec ... \;
: สำหรับผลลัพธ์แต่ละรายการให้ทำคำสั่งต่อไปนี้ใน ...
rm -rf {}
: บังคับซ้ำลบไดเรกทอรี; {}
ส่วนหนึ่งคือการที่ผลการค้นหาที่ได้รับการทดแทนเข้าจากส่วนก่อนหน้านี้หรือใช้:
find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf
ซึ่งมีประสิทธิภาพมากกว่านี้เล็กน้อยเนื่องจากเป็น:
rm -rf dir1 dir2 dir3 ...
ตรงข้ามกับ:
rm -rf dir1; rm -rf dir2; rm -rf dir3; ...
ตาม-exec
วิธีการ
ด้วยเวอร์ชันที่ทันสมัยของfind
คุณสามารถแทนที่;
ด้วย+
และมันจะทำการเทียบเท่ากับการxargs
โทรของคุณผ่านไฟล์มากเท่าที่จะพอดีกับการเรียกระบบ exec แต่ละครั้ง:
find . -type d -ctime +10 -exec rm -rf {} +
-mtime
ดีกว่าสำหรับฉันเพราะมันตรวจสอบการเปลี่ยนแปลงเนื้อหามากกว่าการเปลี่ยนแปลงการอนุญาตมิฉะนั้นจะสมบูรณ์แบบ
find /path/to/base/dir/*
เพื่อป้องกันการนี้เพียงใช้:
-mindepth 1
(มากกว่า/path/to/folder/*
)
หากคุณต้องการลบไดเรกทอรีย่อยทั้งหมดใต้/path/to/base
ตัวอย่างเช่น
/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3
แต่คุณไม่ต้องการลบราก/path/to/base
คุณต้องเพิ่ม-mindepth 1
และ-maxdepth 1
ตัวเลือกซึ่งจะเข้าถึงเฉพาะไดเรกทอรีย่อยภายใต้/path/to/base
-mindepth 1
ไม่รวมรูท/path/to/base
จากการแข่งขัน
-maxdepth 1
จะเฉพาะตรงกับไดเรกทอรีย่อยในทันที/path/to/base
เช่น/path/to/base/dir1
, /path/to/base/dir2
และ/path/to/base/dir3
แต่มันจะไม่ไดเรกทอรีรายชื่อเหล่านี้ในลักษณะ recursive ดังนั้นไดเรกทอรีย่อยตัวอย่างเหล่านี้จะไม่ถูกแสดง:
/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1
และอื่น ๆ
ดังนั้นเพื่อลบไดเรกทอรีย่อยทั้งหมด/path/to/base
ที่เก่ากว่า 10 วัน;
find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf
find
รองรับ-delete
การทำงานดังนั้น:
find /base/dir/* -ctime +10 -delete;
ฉันคิดว่ามีไฟล์ที่ต้องมีอายุมากกว่า 10 วันขึ้นไปเช่นกัน ยังไม่ได้ลองใครบางคนอาจยืนยันในความคิดเห็น
วิธีแก้ปัญหาที่โหวตมากที่สุดที่นี่จะหายไป-maxdepth 0
ดังนั้นมันจะเรียกร้องrm -rf
ให้ทุกไดเรกทอรีย่อยหลังจากลบมัน ไม่สมเหตุสมผลดังนั้นฉันขอแนะนำ:
find /base/dir/* -maxdepth 0 -type d -ctime +10 -exec rm -rf {} \;
-delete
วิธีการแก้ปัญหาข้างต้นไม่ได้ใช้-maxdepth 0
เพราะfind
จะบ่นว่า dir ไม่ว่างเปล่า แต่มันหมายถึง-depth
และลบจากล่างขึ้นบน
-delete
งาน rmdir
แต่ชอบคุณบอกว่าคุณสามารถใช้มันเพื่อลบไดเรกทอรีว่างเหมือน
ฉันพยายามดิ้นรนเพื่อให้ถูกต้องโดยใช้สคริปต์ที่ให้ไว้ข้างต้นและสคริปต์อื่น ๆ โดยเฉพาะเมื่อไฟล์และชื่อโฟลเดอร์มีการขึ้นบรรทัดใหม่หรือเว้นวรรค
ในที่สุดก็สะดุดกับ tmpreaper และมันก็ใช้งานได้ดีสำหรับเราจนถึงตอนนี้
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
ลิงค์ต้นฉบับ
มีคุณสมบัติเช่นการทดสอบซึ่งตรวจสอบไดเรกทอรีซ้ำและรายการพวกเขา ความสามารถในการลบ symlink ไฟล์หรือไดเรกทอรีและโหมดการป้องกันสำหรับรูปแบบบางอย่างขณะที่ลบ
หรือ
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
อัปเดตแล้วเวอร์ชันที่เร็วกว่า:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f
xargs --show-limits
ดู
-print0
/ -0
ดูแลอักขระพิเศษของเชลล์หรือไม่?
xargs
เวอร์ชันจะ @mpen แต่บรรทัดแรกจะไม่
find
ทำได้โดยไม่ต้องดูชื่อ ...