วิธีลบไฟล์ที่เก่ากว่า X ชั่วโมง


191

ฉันกำลังเขียนสคริปต์ทุบตีที่ต้องการลบไฟล์เก่า

ปัจจุบันมีการใช้งานโดย:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

การดำเนินการนี้จะลบไฟล์ที่เก่ากว่า 1 วัน

อย่างไรก็ตามถ้าฉันต้องการความละเอียดที่ละเอียดกว่านั้นใน 1 วันพูดเหมือนอายุ 6 ชั่วโมงล่ะ มีวิธีทำความสะอาดที่ดีที่จะทำเช่นมีการใช้การค้นหาและเวลา?

คำตอบ:


303

คุณfindมี-mminตัวเลือกหรือไม่? ที่สามารถให้คุณทดสอบจำนวนนาทีตั้งแต่การแก้ไขครั้งล่าสุด:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

หรืออาจดูที่การใช้tmpwatchเพื่อทำงานเดียวกัน phjr ยังแนะนำtmpreaperในความคิดเห็น


2
การใช้ --mmin + X คืนค่าไฟล์ทั้งหมดด้วยการค้นหาของฉัน ความผิดของฉันที่ไม่ได้ตรวจสอบสิ่งนี้ก่อน แต่คำสั่งนี้เพิ่งลบไดเรกทอรีบ้านส่วนใหญ่ของฉัน สำหรับฉัน - นาที -X เป็นอาร์กิวเมนต์ที่ถูกต้อง
brandones

tmpreaperเป็นส่วนหนึ่งของ tmpwatch มันปลอดภัยกว่าและมีอยู่เป็นแพ็คเกจ debian ใน distro ประโยชน์ที่ได้รับมากกว่าพบการลบ: tmpreaper จะไม่ลบ symlinks ซ็อกเก็ต, FIFOs หรือไฟล์พิเศษ
นาดี

ชี้ให้เห็นว่า $ REQUIRED_FILES ต้องอยู่ในเครื่องหมายคำพูด (เครื่องหมายคำพูดคู่) และคุณสามารถใช้รูปแบบเช่น: " .txt" สำหรับไฟล์. txt ทั้งหมดหรือไฟล์ที่ขึ้นต้นด้วยรูปแบบเช่น: "temp- " เพื่อลบไฟล์ทั้งหมดที่มีชื่อ temp -
achasinh

@PaulDixon วิธีการแก้ไขนี้เพื่อให้$LOCATIONและ$REQUIRED_FILESสามารถมีหลายค่าเช่นdir1 dir2และ*.txt *.tmp?
Enissay

@Enissay $ LOCATION เป็นไดเรกทอรีเดียว สำหรับส่วนขยายหลายรายการคุณอาจต้องการใช้รูปแบบด้วย -regex - ดูstackoverflow.com/questions/5249779//
Paul Dixon

9

คุณสามารถใช้เคล็ดลับนี้: สร้างไฟล์ 1 ชั่วโมงที่ผ่านมาและใช้ -newer fileอาร์กิวเมนต์

(หรือใช้touch -tเพื่อสร้างไฟล์ดังกล่าว)


1
ไม่มีสวิตช์ตัวยึดตำแหน่ง (อย่างน้อยในคำสั่ง find ของฉัน) และนั่นคือสิ่งที่จำเป็น น้อยไม่ช่วย
iconoclast

คุณสามารถให้คำสั่งแบบสัมผัสที่จะสร้างไฟล์อายุ 1 ชั่วโมงที่จะทำงานกับเครื่องที่ไม่สามารถใช้ -mmin ได้หรือไม่? (หากคุณใช้งานบน Linux, -mmin สามารถใช้ได้หากไม่ได้ระบุวันที่และคำสั่งอื่น ๆ ก็จะมีข้อด้อยในการเปรียบเทียบ)
iconoclast

2
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) testสร้างไฟล์testที่อายุ 1 ชั่วโมงเสมอ
rovr138

4

นี่คือวิธีการที่เหมาะกับฉัน (และฉันไม่เห็นว่ามีการใช้งานด้านบน)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

การลบไฟล์ทั้งหมดที่เก่ากว่า 59 นาทีในขณะที่ปล่อยให้โฟลเดอร์ยังคงอยู่


ดีกว่าไปที่อัญประกาศเดี่ยว'*.*'หรือเชลล์จะขยายไปยังชื่อไฟล์จริงแทนที่จะทำให้มันเป็นสัญลักษณ์แทนสำหรับfindการแก้ไข แบ่งนี้find's ดำเนินการเวียนเกิดใน subdirs
MestreLion

นอกจากนี้ยังเก็บไว้ในใจว่า-name '*.*'จะไม่ลบไฟล์ที่มีนามสกุลไม่มีเช่นREADME, Makefileฯลฯ
MestreLion

1

สำหรับ SunOS 5.10

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.


0

หากคุณไม่มี "-mmin" ในรุ่น "find" ของคุณดังนั้น "-mtime -0.041667" เข้าใกล้ "ภายในชั่วโมงสุดท้าย" ดังนั้นในกรณีของคุณให้ใช้:

-mtime +(X * 0.041667)

ดังนั้นถ้า X หมายถึง 6 ชั่วโมงจากนั้น:

find . -mtime +0.25 -ls

ทำงานได้เพราะ 24 ชั่วโมง * 0.25 = 6 ชั่วโมง


มีความหวังเพราะ UNIX เก่านี้ไม่มี -mmin แต่น่าเสียดายที่ไม่มีความช่วยเหลือเนื่องจาก UNIX เก่านี้ไม่ชอบค่าเศษส่วนสำหรับ mtime: find: อาร์กิวเมนต์ถึง -mtime ต้องเป็นจำนวนเต็มในช่วง -2147483647 ถึง 2147483647
kbulgrien

0

นี่คือสิ่งที่เราสามารถทำได้เพื่อดำเนินการต่อไปในทางที่ @iconoclast สงสัยในความคิดเห็นของพวกเขาในคำตอบอื่น

ใช้ crontab สำหรับผู้ใช้หรือ/etc/crontabสร้างไฟล์/tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

จากนั้นใช้สิ่งนี้เพื่อเรียกใช้คำสั่งของคุณ:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

*/1สำหรับรายชั่วโมงซ้ำซ้อนใน crontab ของคุณ มันเหมือนกับการใส่ * ในฟิลด์ชั่วโมง
colm.anseo


0

หากfindไม่มี-mminและหากยังติดอยู่กับfindที่ยอมรับเฉพาะค่าจำนวนเต็มสำหรับ-mtimeแล้วทั้งหมดไม่จำเป็นต้องหายไปถ้าใครคิดว่า "เก่ากว่า" คล้ายกับ "ไม่ใหม่กว่า"

หากเราสามารถสร้างไฟล์ที่มีเวลาตัดเวลาเราก็สามารถถามได้ findให้ค้นหาไฟล์ที่ "ไม่ใหม่กว่า" ไฟล์อ้างอิงของเรา

ในการสร้างไฟล์ที่มีการประทับเวลาที่ถูกต้องเป็นบิตที่เกี่ยวข้องเพราะระบบที่ไม่ได้มีเพียงพอfindอาจจะยังมีน้อยกว่าความสามารถในคำสั่งที่สามารถทำสิ่งที่ชอบdate date +%Y%m%d%H%M%S -d "6 hours ago"

โชคดีที่เครื่องมือเก่าอื่น ๆ ที่สามารถจัดการสิ่งนี้ได้แม้ว่าจะเป็นวิธีที่ไม่สะดวกกว่า

พิจารณาว่าหกชั่วโมงคือ 21600 วินาที เราต้องการค้นหาเวลาที่มีเมื่อหกชั่วโมงก่อนในรูปแบบที่มีประโยชน์:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

คำสั่ง perl สร้างวันที่มีประโยชน์ แต่ต้องใช้ให้ดีขึ้น:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

ตอนนี้โซลูชันสำหรับ UNIX เก่านี้มีบางอย่างที่สอดคล้องกับ:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

มันอาจเป็นความคิดที่ดีในการทำความสะอาดไฟล์อ้างอิงของเรา

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