ฉันต้องลบไฟล์ที่เก่ากว่า 3 วันด้วยงาน cron ใน 3 ไดเรกทอรีที่แตกต่างกัน (ทั้ง 3 ไดเรกทอรีนี้เป็นรายการย่อยของไดเรกทอรีหลัก/a/b/c/1
& /a/b/c/2
& /a/b/c/3
) สามารถทำได้ด้วยหนึ่งบรรทัดใน crontab หรือไม่
ฉันต้องลบไฟล์ที่เก่ากว่า 3 วันด้วยงาน cron ใน 3 ไดเรกทอรีที่แตกต่างกัน (ทั้ง 3 ไดเรกทอรีนี้เป็นรายการย่อยของไดเรกทอรีหลัก/a/b/c/1
& /a/b/c/2
& /a/b/c/3
) สามารถทำได้ด้วยหนึ่งบรรทัดใน crontab หรือไม่
คำตอบ:
นี่เป็นเรื่องง่ายพอ (แม้ว่าโปรดทราบว่าสิ่งนี้เกิดขึ้นจากเวลาการแก้ไขมากกว่า 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 {} +
ลบอีกครั้ง#
เมื่อคุณแน่ใจว่าคุณมีไฟล์ที่ถูกต้อง
อ้างจากStéphane Chazelas แสดงความคิดเห็นด้านล่าง:
โปรดทราบว่า
-exec rm {} +
มีช่องโหว่ของเงื่อนไขการแข่งขันซึ่ง-delete
(ถ้ามี) ไม่ได้ ดังนั้นอย่าใช้มันในไดเรกทอรีที่คนอื่นเขียนได้ บางคนพบว่ามีสิ่ง-execdir
ที่ช่วยลดความเสี่ยงจากช่องโหว่เหล่านั้น
/a/b/c/[12]
แต่สิ่งนี้จะเหมาะสมถ้าไดเรกทอรีย่อยมีชื่อตัวอักษรเดียว ในที่คุณสามารถทำได้bash
/a/b/c/{1,2}
แน่นอนว่าบางบรรทัดของสคริปต์จะต้องเป็น#!/bin/bash
หรือถ้าคุณใช้ crontab คุณต้องตรวจสอบให้แน่ใจว่าได้กำหนดค่าให้ใช้งานแล้วbash
(ฉันไม่แนะนำให้เปลี่ยนถ้าไม่ใช้)
ksh
, bash
และzsh
ยังมีผู้ประกอบการในการสลับ globs ของพวกเขา โปรดทราบว่า-exec rm {} +
มีช่องโหว่ของเงื่อนไขการแข่งขันซึ่ง-delete
(ถ้ามี) ไม่ได้ ดังนั้นอย่าใช้มันในไดเรกทอรีที่คนอื่นเขียนได้ บางคนพบว่ามีสิ่ง-execdir
ที่ช่วยลดความเสี่ยงจากช่องโหว่เหล่านั้น
rm -f
จัดการกับข้อผิดพลาดอย่างเงียบ ๆ ดังนั้นจัดการกับสภาพการแข่งขันที่เป็นไปได้ด้วย-exec
หรือไม่
คุณจะใช้งานได้ดีขึ้นมาก 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.
tmpwatch
ได้รับการแยกไปtmpreaper
ที่ (อย่างน้อยก็ใน Debian) ซึ่งดูเหมือนว่าจะเป็นการแทนที่
/a/b/c/
ไม่จำเป็นต้องระบุสำหรับตัวเลือกทุกตัวหรือไม่