ฉันเขียนคำสั่งด้านล่างเพื่อลบไฟล์ทั้งหมดที่เก่ากว่า 7 วัน แต่มันไม่ทำงาน:
find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;
ฉันจะลบไฟล์เหล่านี้ได้อย่างไร
ฉันเขียนคำสั่งด้านล่างเพื่อลบไฟล์ทั้งหมดที่เก่ากว่า 7 วัน แต่มันไม่ทำงาน:
find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;
ฉันจะลบไฟล์เหล่านี้ได้อย่างไร
คำตอบ:
ในฐานะที่เป็น @Jos ชี้ให้คุณพลาดช่องว่างระหว่างname
และ'*.gz'
; นอกจากนี้สำหรับการเร่ง-type f
ตัวเลือกการใช้คำสั่งเพื่อเรียกใช้คำสั่งบนf iles เท่านั้น
ดังนั้นคำสั่งคงที่จะเป็น:
find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;
find
: คำสั่ง unix สำหรับค้นหาf iles / d irectories / l inks และอื่น ๆ/path/to/
: ไดเรกทอรีเพื่อเริ่มการค้นหาของคุณ-type f
: ค้นหาไฟล์เท่านั้น-name '*.gz'
: .gz
แฟ้มรายชื่อที่ลงท้ายด้วย-mtime +7
: พิจารณาเฉพาะสิ่งที่มีเวลาแก้ไขที่เก่ากว่า 7 วัน-execdir ... \;
: ...
สำหรับแต่ละผลดังกล่าวพบทำคำสั่งต่อไปในrm -- '{}'
: ลบไฟล์; {}
ส่วนหนึ่งคือการที่ผลการค้นหาที่ได้รับการทดแทนเข้าจากส่วนก่อนหน้านี้ --
หมายถึงจุดสิ้นสุดของพารามิเตอร์คำสั่งหลีกเลี่ยงการแจ้งข้อผิดพลาดสำหรับไฟล์เหล่านั้นที่เริ่มต้นด้วยเครื่องหมายขีดกลางfind /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --
จากคนค้นหา :
-print0
True; print the full file name on the standard output, followed by a null character
(instead of the newline character that -print uses). This allows file names that contain
newlines or other types of white space to be correctly interpreted by programs that process
the find output. This option corresponds to the -0 option of xargs.
ซึ่งมีประสิทธิภาพมากกว่านี้เล็กน้อยเนื่องจากเป็น:
rm file1 file2 file3 ...
ตรงข้ามกับ:
rm file1; rm file2; rm file3; ...
ตาม-exec
วิธีการ
ทางเลือกและคำสั่งที่เร็วกว่านั้นกำลังใช้+
terminator ของ exec แทน\;
:
find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +
คำสั่งนี้จะทำงานrm
เพียงครั้งเดียวในตอนท้ายแทนทุกครั้งที่พบไฟล์และคำสั่งนี้เกือบจะเร็วเท่ากับการใช้-delete
ตัวเลือกดังต่อไปนี้ในโมเดิร์นfind
:
find /path/to/ -type f -mtime +7 -name '*.gz' -delete
-delete
จบด้วยล่ะ? ทำไมยุ่งกับ+
หรือ\;
?
ระวังการลบไฟล์ด้วยการค้นหา รันคำสั่งด้วย -ls เพื่อตรวจสอบสิ่งที่คุณกำลังลบ
find /media/bkfolder/ -mtime +7 -name '*.gz' -ls
. จากนั้นดึงคำสั่งขึ้นมาจากประวัติและต่อท้าย-exec rm {} \;
จำกัดความเสียหายที่คำสั่ง find สามารถทำได้ หากคุณต้องการที่จะลบไฟล์จากเพียงหนึ่งไดเรกทอรี-maxdepth 1
ป้องกันไม่ให้พบจากการเดินผ่านไดเรกทอรีย่อยหรือจากการค้นหาระบบเต็มถ้าคุณ /media/bkfolder /
typo
ข้อ จำกัด อื่น ๆ ที่ฉันเพิ่มเป็นข้อโต้แย้งชื่อที่เฉพาะเจาะจงเช่น-name 'wncw*.gz'
การเพิ่มเวลาที่ใหม่กว่า -mtime -31
และการอ้างอิงไดเรกทอรีที่ค้นหา สิ่งเหล่านี้มีความสำคัญอย่างยิ่งหากคุณทำการล้างข้อมูลโดยอัตโนมัติ
find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;
name
'*.gz'