ฉันต้องลบไฟล์ที่เก่ากว่า 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/ไม่จำเป็นต้องระบุสำหรับตัวเลือกทุกตัวหรือไม่