เชลล์สคริปต์เพื่อลบไดเรกทอรีเก่ากว่า n วัน


165

ฉันมีไดเรกทอรีชื่อเป็น:

2012-12-12
2012-10-12
2012-08-08

ฉันจะลบไดเรกทอรีที่เก่ากว่า 10 วันด้วย bash shell script ได้อย่างไร


1
พวกเขาแสดงความสัมพันธ์กับเวลาการสร้าง / การเปลี่ยนแปลงจริงหรือไม่? เพราะfindทำได้โดยไม่ต้องดูชื่อ ...
Wrikken

พวกเขาควรจะได้มีเวลาในการสร้าง / การปรับเปลี่ยนที่พวกเขาได้เป็นอย่างดี
bobsr

4
คุณหมายถึงอะไรโดย "เก่ากว่า"? คุณหมายถึงเวลาที่ไดเรกทอรีถูกสร้างขึ้นเวลาที่เนื้อหาถูกเปลี่ยนแปลงครั้งล่าสุดหรืออย่างอื่น? ระวังด้วยคำตอบบางข้อด้านล่าง; ctimeเป็นเวลาเปลี่ยนแปลง inode สำหรับไดเรกทอรีมันจะเปลี่ยนเมื่อไฟล์ถูกเพิ่มหรือลบออกจากไดเรกทอรี
ajk

คำตอบ:


391

สิ่งนี้จะทำซ้ำเพื่อคุณ:

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 {} +

13
-mtimeดีกว่าสำหรับฉันเพราะมันตรวจสอบการเปลี่ยนแปลงเนื้อหามากกว่าการเปลี่ยนแปลงการอนุญาตมิฉะนั้นจะสมบูรณ์แบบ
quickshiftin

7
ฉันคิดว่านี่จะลบฐาน dir เอง
หรือ Gal

3
@Orgal คุณถูกต้องอย่างแน่นอน find /path/to/base/dir/*เพื่อป้องกันการนี้เพียงใช้:
zloynemec

11
คุณสามารถใช้ -maxdepth 1 เพื่อเพิกเฉยเนื้อหาของไดเร็กตอรี่ได้
Sam

7
วิธีที่มีประสิทธิภาพมากขึ้นสามารถ backfire ถ้าคุณมีโฟลเดอร์มากเกินไปที่จะลบ: stackoverflow.com/questions/11289551/... ด้วยเหตุผลเดียวกันเพื่อที่จะหลีกเลี่ยงการลบฐานโฟลเดอร์ดีกว่าที่จะใช้-mindepth 1(มากกว่า/path/to/folder/*)
Ohad Schneider

41

หากคุณต้องการลบไดเรกทอรีย่อยทั้งหมดใต้/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

20

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แต่ชอบคุณบอกว่าคุณสามารถใช้มันเพื่อลบไดเรกทอรีว่างเหมือน
CTodea

3

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

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

tmpreaper -t 5d ~/Downloads


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

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

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


2

หรือ

rm -rf `find /path/to/base/dir/* -type d -mtime +10`

อัปเดตแล้วเวอร์ชันที่เร็วกว่า:

find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f

2
อันนี้อาจเกินความยาว commandline สูงสุดได้อย่างง่ายดาย xargs --show-limitsดู
Michael Krupp

2
และจะไม่ทำงานหากมีชื่อไฟล์ที่มีช่องว่างหรืออักขระเชลล์พิเศษอื่น ๆ
Martin Tournoij

@Carpetsmoker ไม่มี-print0/ -0ดูแลอักขระพิเศษของเชลล์หรือไม่?
mpen

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