Cron job ลบไฟล์ที่เก่ากว่า 3 วัน


21

ฉันต้องลบไฟล์ที่เก่ากว่า 3 วันด้วยงาน cron ใน 3 ไดเรกทอรีที่แตกต่างกัน (ทั้ง 3 ไดเรกทอรีนี้เป็นรายการย่อยของไดเรกทอรีหลัก/a/b/c/1& /a/b/c/2& /a/b/c/3) สามารถทำได้ด้วยหนึ่งบรรทัดใน crontab หรือไม่

คำตอบ:


26

นี่เป็นเรื่องง่ายพอ (แม้ว่าโปรดทราบว่าสิ่งนี้เกิดขึ้นจากเวลาการแก้ไขมากกว่า 3 วันที่ผ่านมาเนื่องจากเวลาในการสร้างมีเฉพาะในระบบไฟล์ที่มีเครื่องมือพิเศษเท่านั้น):

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete

ลบ#ก่อนหน้า-deleteเมื่อคุณแน่ใจว่ากำลังค้นหาไฟล์ที่คุณต้องการลบ

ที่จะมีมันดำเนินการโดย cron ผมอาจจะเพียงแค่สร้างสคริปต์ปฏิบัติการ (เพิ่ม shebang - การ#!bin/shไปยังบรรทัดด้านบนของไฟล์และทำให้ปฏิบัติการด้วยchmod a+x) แล้ววางไว้ในที่เหมาะสมcronไดเรกทอรีเหมือนหรือ/etc/cron.daily /etc/cron.weeklyแน่นอนว่าคุณไม่จำเป็นต้องมีตารางที่เฉพาะเจาะจงมากขึ้นและมีไดเรกทอรีเหล่านี้อยู่ใน distro ของคุณ

ปรับปรุง

ตามที่ระบุไว้ด้านล่าง-deleteตัวเลือกสำหรับfindพกพาไม่ได้มาก วิธีที่เข้ากันได้กับ POSIX จะเป็น:

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +

ลบอีกครั้ง#เมื่อคุณแน่ใจว่าคุณมีไฟล์ที่ถูกต้อง

Update2

อ้างจากStéphane Chazelas แสดงความคิดเห็นด้านล่าง:

โปรดทราบว่า-exec rm {} +มีช่องโหว่ของเงื่อนไขการแข่งขันซึ่ง-delete(ถ้ามี) ไม่ได้ ดังนั้นอย่าใช้มันในไดเรกทอรีที่คนอื่นเขียนได้ บางคนพบว่ามีสิ่ง-execdirที่ช่วยลดความเสี่ยงจากช่องโหว่เหล่านั้น


ขอบคุณ! มีวิธีการระบุไดเรกทอรีหลักแล้วไดเรกทอรีย่อยดังนั้น/a/b/c/ไม่จำเป็นต้องระบุสำหรับตัวเลือกทุกตัวหรือไม่
KingKongFrog

แน่นอนว่าใน POSIX เชลล์คุณสามารถทำได้/a/b/c/[12]แต่สิ่งนี้จะเหมาะสมถ้าไดเรกทอรีย่อยมีชื่อตัวอักษรเดียว ในที่คุณสามารถทำได้bash /a/b/c/{1,2}แน่นอนว่าบางบรรทัดของสคริปต์จะต้องเป็น#!/bin/bashหรือถ้าคุณใช้ crontab คุณต้องตรวจสอบให้แน่ใจว่าได้กำหนดค่าให้ใช้งานแล้วbash(ฉันไม่แนะนำให้เปลี่ยนถ้าไม่ใช้)
แกรม

2
การขยายรั้งเป็นคุณลักษณะ csh และยังรองรับโดย ksh, bash, zsh และปลาเพื่อให้คุณมีกระสุนให้เลือกมากมาย ksh, bashและzshยังมีผู้ประกอบการในการสลับ globs ของพวกเขา โปรดทราบว่า-exec rm {} +มีช่องโหว่ของเงื่อนไขการแข่งขันซึ่ง-delete(ถ้ามี) ไม่ได้ ดังนั้นอย่าใช้มันในไดเรกทอรีที่คนอื่นเขียนได้ บางคนพบว่ามีสิ่ง-execdirที่ช่วยลดความเสี่ยงจากช่องโหว่เหล่านั้น
Stéphane Chazelas

ไม่rm -fจัดการกับข้อผิดพลาดอย่างเงียบ ๆ ดังนั้นจัดการกับสภาพการแข่งขันที่เป็นไปได้ด้วย-execหรือไม่
คิวเมนตัส


9

คุณจะใช้งานได้ดีขึ้นมาก tmpwatch

tmpwatch recursively removes files which haven't been accessed for a given time. Normally, it's used to clean up directories which are used for temporary holding space such as /tmp.

2
tmpwatchได้รับการแยกไปtmpreaperที่ (อย่างน้อยก็ใน Debian) ซึ่งดูเหมือนว่าจะเป็นการแทนที่
Jaap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.