ฉันมีโฟลเดอร์แคชอย่างน้อย 15,000 ไฟล์
ฉันลองสิ่งนี้:
find cache* -mtime +30 -exec rm {} \;
แต่นี่ทำให้โหลดเซิร์ฟเวอร์ของฉันบินไปบนท้องฟ้า!
มีวิธีใดที่เร็วกว่าหรือดีกว่า
หรือฉันสามารถจำกัด ความเร็วหรือทำซ้ำคำสั่งนี้ได้หรือไม่?
ฉันมีโฟลเดอร์แคชอย่างน้อย 15,000 ไฟล์
ฉันลองสิ่งนี้:
find cache* -mtime +30 -exec rm {} \;
แต่นี่ทำให้โหลดเซิร์ฟเวอร์ของฉันบินไปบนท้องฟ้า!
มีวิธีใดที่เร็วกว่าหรือดีกว่า
หรือฉันสามารถจำกัด ความเร็วหรือทำซ้ำคำสั่งนี้ได้หรือไม่?
คำตอบ:
ฉันชอบที่จะใช้tmpwatch
สำหรับสิ่งเหล่านี้นี่เป็นครั้งสุดท้ายที่ไฟล์ถูกแก้ไข มันง่ายและทำงานได้ดีในหลายกรณี:
tmpwatch -m 720 /path/to/cache
สำหรับ Ubuntu ให้ตรวจสอบtmpreaper
แทน
หากคุณต้องการตรวจสอบครั้งล่าสุดที่มีการเข้าถึงไฟล์มากกว่าที่คุณใช้ดังต่อไปนี้:
tmpwatch -a 720 /path/to/cache
คุณไม่สามารถใช้ tmpwatch -a บนระบบไฟล์ที่เมาท์ด้วยเวลากลางคืน คุณยังสามารถใช้ -m
Ubuntu 10.04.2 LTS
และคำสั่งที่ไม่อยู่ ..
tmpreaper
แทน
คุณสามารถหลีกเลี่ยงการวางไข่ของกระบวนการใหม่สำหรับแต่ละไฟล์โดยใช้
find cache* -mtime +30 -delete
ลองเรียกใช้ข้างต้นด้วยวิธีที่ดี:
nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'
ด้วยวิธีนี้โหลดขนาดใหญ่จะปรากฏขึ้นหากไม่มีสิ่งใดจำเป็นต้องใช้งานมิฉะนั้นกระบวนการอื่นจะมีความสำคัญกว่า (หากความสวยงามของพวกเขาต่ำกว่า 19 นั่นคือค่าสูงสุด)
โปรดทราบว่าอาร์กิวเมนต์ของตัวเลือก -n จะถูกเพิ่มเข้ากับความละเอียดเริ่มต้นซึ่งแตกต่างกันระหว่าง -20 และ 19 ฉันใช้ 39 เพื่อที่จะดีมากโดยไม่คำนึงถึงความดีดั้งเดิมที่มีอยู่
ตามความเห็นโดย chiborg โหลดเกิดจากการเริ่ม rm สำหรับทุกไฟล์ที่พบ ฉันสังเกตเห็นคำตอบที่tmpwatch
แนะนำเป็นทางเลือกซึ่งฉันแน่ใจว่าทำงานได้ดี อย่างไรก็ตามมันไม่จำเป็น
ค้นหาสามารถเรียกใช้คำสั่งที่กำหนดให้ผู้บริหารหนึ่งครั้งหากคุณบอกให้รวบรวมไฟล์ที่พบในรายการของอาร์กิวเมนต์ดังนี้:
find /path -name "*.moo" -exec rm {} \+
บางครั้งสิ่งนี้อาจล้มเหลวในการทำงานเนื่องจากรายการอาร์กิวเมนต์อาจใหญ่ขึ้น (เป็นไบต์) มากกว่าจำนวนสูงสุดที่เชลล์อนุญาต (getconf ARG_MAX) สิ่งนี้อาจแก้ไขได้ด้วย xargs พร้อมกับตัวเลือก -L
ลองพิจารณาตัวอย่างนี้:
$ echo 0 > /tmp/it;
$ for i in {0..15000};do echo $i;done |\
xargs --no-run-if-empty -L 5000 ./tmp/xr.sh
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments
$ cat tmp/xr.sh
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it
ดังนั้นไม่จำเป็นต้องติดตั้งซอฟต์แวร์เพิ่มเติมสิ่งที่คุณต้องมีคือ gnu-findutils:
find /path -mtime +30 -print0 | xargs -0 -L 5000 rm
\+
; ธรรมดา+
ดีพอ (2) สิ่งนี้จะไม่“ ไม่ทำงานเนื่องจากรายการอาร์กิวเมนต์อาจโตขึ้นมาก…” find … -exec … {} +
จะทำในสิ่งเดียวกันกับที่xargs
จะทำ มันจะเรียกใช้คำสั่งหลาย ๆ ครั้งตามที่ต้องการ ตัวอย่างเช่น (เช่นในตัวอย่างของคุณ) หากคุณมีไฟล์ระหว่าง 1,5001 ถึง 20,000 ให้find
เรียกใช้-exec
โปรแกรม 'd ( rm
) สี่ครั้ง
cache*
ขยายไปยังหลายไฟล์คุณอาจต้องการลองfind . -name 'cache*' -mtime +30 -exec rm {} \;
ใช้แทน