ลบไฟล์ทั้งหมดที่สร้างขึ้นก่อนวันที่กำหนด


26

ฉันมีไดเรกทอรีที่มีไฟล์จำนวนมาก (เช่นบันทึกสำหรับทุกวันของปี) ฉันต้องการลบไฟล์ทั้งหมดที่สร้างขึ้นก่อนหน้านี้ว่า 22/11 ฉันจะบรรลุสิ่งนั้นได้อย่างไร ฉันจะต้องใช้findexec แล้ว-rmหรือไม่ ฉันใช้ ksh


1
ข้อแม้ปกติคือระบบไฟล์ Unix โดยทั่วไปไม่ได้มีการบันทึกเมื่อไฟล์ถูกสร้างขึ้น - เฉพาะเวลาที่ไอโหนดและเนื้อหาถูกแก้ไขล่าสุดจะสามารถใช้ได้
Toby Speight

คำตอบ:


35

การใช้findยังคงเป็นวิธีที่ต้องการในการลบไฟล์ ดูhttp://mywiki.wooledge.org/UsingFindสำหรับข้อมูลเพิ่มเติม

วิธีหนึ่งในการทำเช่นนี้คือการสร้างไฟล์ที่มีการประทับเวลาในไฟล์ เช่น

touch -t 201311220000 /tmp/timestamp

ตอนนี้ลบไฟล์ GNU find(สมมติว่าอยู่ในไดเรกทอรีปัจจุบัน) ที่ตรงกับการลงเวลาเช่น:

find . -type f ! -newer /tmp/timestamp -delete  

หรือไม่พบ GNU

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
แล้วเรื่องนี้ล่ะ มันใช้งานได้หรือไม่ ค้นหา -type f -mtime +5 -exec rm -f {} \;
user1058398

1
@ user1058398 นั่นจะลบไฟล์ที่เก่ากว่า 5 วันนับจากนี้
Valentin Bajrami

มันลบโฟลเดอร์พร้อมกับไฟล์ด้วยหรือไม่ @ val0x00ff
alper

1
@Avatar ไม่เนื่องจากtype -fจำกัด การดำเนินการกับไฟล์เท่านั้น
Valentin Bajrami

22

ด้วย GNU หรือ BSD บางส่วนfind:

find . ! -newermt 2013-11-22 ! -type d -delete

โปรดทราบว่ามันจะตรวจสอบเวลาแก้ไขล่าสุดของไฟล์ ใน BSD บางตัวคุณสามารถใช้-newerBtแทน-newermtการตรวจสอบเวลาเกิดไอโหนดของไฟล์หากมีให้แทน


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

ตัวอย่าง:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

ในกรณีนี้มันจะลบไฟล์ทั้งหมดที่เริ่มต้นด้วย "ORA_XEO" มากกว่า 15 วัน


แม้ว่าจะดูดีกว่าด้วยrm -rfคำสั่งแรกจะลบทุกสิ่งที่มีอยู่ในไดเรกทอรีใด ๆ ที่เก่ากว่า 15 วันนั้น (ทำไมต้องเป็นวงเล็บด้วย-nameล่ะ?)
ilkkachu

คุณพูดถูกเราไม่จำเป็นต้องใส่ "(" ")"
calafate

แต่ถ้าเราต้องการเพิ่มเงื่อนไขก็สามารถเป็นประโยชน์ได้ ตัวอย่างเช่นหากเราต้องการลบไฟล์ทั้งหมดที่ลงท้ายด้วย ".jar" หรือ ".cp" และเริ่มต้นด้วย "ex" example.jar- มันจะถูกลบexample.cp- มันจะถูกลบออก example.tar- มันจะถูกลบออก
calafate

ในกรณีนี้เราสามารถใช้:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
calafate

ซึ่งจะลบบางไฟล์ออกจาก<จำนวนวัน>มากกว่าไฟล์ทั้งหมดที่เก่ากว่า<จำนวนวัน>เว้นแต่ว่าคุณจะรันมันตอนเที่ยงคืนและเสร็จสิ้นภายในเสี้ยววินาที ด้วย GNU findคุณควรใช้-daystartตัวปรับแต่งเพื่อบังคับ-mtimeค่าเป็นเที่ยงคืน
roaima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.