การลบไฟล์ที่เก่ากว่าอย่างสง่างามกว่า 30 วัน


8

ฉันมีโฟลเดอร์แคชอย่างน้อย 15,000 ไฟล์

ฉันลองสิ่งนี้:

find cache* -mtime +30 -exec rm {} \;

แต่นี่ทำให้โหลดเซิร์ฟเวอร์ของฉันบินไปบนท้องฟ้า!

มีวิธีใดที่เร็วกว่าหรือดีกว่า

หรือฉันสามารถจำกัด ความเร็วหรือทำซ้ำคำสั่งนี้ได้หรือไม่?


1
หากcache*ขยายไปยังหลายไฟล์คุณอาจต้องการลองfind . -name 'cache*' -mtime +30 -exec rm {} \;ใช้แทน
Jaap Eldering

คำตอบ:


10

ฉันชอบที่จะใช้tmpwatchสำหรับสิ่งเหล่านี้นี่เป็นครั้งสุดท้ายที่ไฟล์ถูกแก้ไข มันง่ายและทำงานได้ดีในหลายกรณี:

tmpwatch -m 720 /path/to/cache

สำหรับ Ubuntu ให้ตรวจสอบtmpreaperแทน

หากคุณต้องการตรวจสอบครั้งล่าสุดที่มีการเข้าถึงไฟล์มากกว่าที่คุณใช้ดังต่อไปนี้:

tmpwatch -a 720 /path/to/cache

คุณไม่สามารถใช้ tmpwatch -a บนระบบไฟล์ที่เมาท์ด้วยเวลากลางคืน คุณยังสามารถใช้ -m


ฉันใช้Ubuntu 10.04.2 LTSและคำสั่งที่ไม่อยู่ ..
Kristian

2
@ คริสเตียนตรวจสอบtmpreaperแทน
slhck

ข้อผิดพลาดใด ๆ เมื่อใช้สิ่งเหล่านี้ในการจัดการระบบไฟล์ที่ติดตั้งด้วยตัวเลือก noatime?
AnonymousLurker

@AnonymousLurker ฉันได้แก้ไขคำตอบของคุณแล้ว
WojonsTech

6

คุณสามารถหลีกเลี่ยงการวางไข่ของกระบวนการใหม่สำหรับแต่ละไฟล์โดยใช้

find cache* -mtime +30 -delete

3

ลองเรียกใช้ข้างต้นด้วยวิธีที่ดี:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

ด้วยวิธีนี้โหลดขนาดใหญ่จะปรากฏขึ้นหากไม่มีสิ่งใดจำเป็นต้องใช้งานมิฉะนั้นกระบวนการอื่นจะมีความสำคัญกว่า (หากความสวยงามของพวกเขาต่ำกว่า 19 นั่นคือค่าสูงสุด)

โปรดทราบว่าอาร์กิวเมนต์ของตัวเลือก -n จะถูกเพิ่มเข้ากับความละเอียดเริ่มต้นซึ่งแตกต่างกันระหว่าง -20 และ 19 ฉันใช้ 39 เพื่อที่จะดีมากโดยไม่คำนึงถึงความดีดั้งเดิมที่มีอยู่


2

ตามความเห็นโดย 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 

d00d บางคนคิดว่ามันจะมีประโยชน์ในการเพิ่ม -print0 และ -0 เพื่อค้นหาและ xargs อาร์กิวเมนต์เหล่านั้นบังคับให้คำสั่งใช้ null char (\ 0) แทนที่จะขึ้นบรรทัดใหม่ (\ n) เพื่อแยกอาร์กิวเมนต์ สิ่งนี้มีประโยชน์เมื่อชื่อไฟล์มีช่องว่างหรือบรรทัดใหม่อยู่
ЯрославРахматуллин

(1) คุณไม่จำเป็นต้องพูด\+; ธรรมดา+ดีพอ (2) สิ่งนี้จะไม่“ ไม่ทำงานเนื่องจากรายการอาร์กิวเมนต์อาจโตขึ้นมาก…”  find  … -exec … {} +จะทำในสิ่งเดียวกันกับที่xargsจะทำ มันจะเรียกใช้คำสั่งหลาย ๆ ครั้งตามที่ต้องการ ตัวอย่างเช่น (เช่นในตัวอย่างของคุณ) หากคุณมีไฟล์ระหว่าง 1,5001 ถึง 20,000 ให้findเรียกใช้-execโปรแกรม 'd ( rm) สี่ครั้ง
G-Man กล่าวว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.