ฉันมีไฟล์fileName_1 , fileName_2 ... fileName_100000โดยที่ fileNames จะถูกกำหนดหมายเลขตามลำดับ ฉันจะลบไฟล์ของดัชนีที่มากกว่าพูด100 ได้อย่างไร?
ฉันมีไฟล์fileName_1 , fileName_2 ... fileName_100000โดยที่ fileNames จะถูกกำหนดหมายเลขตามลำดับ ฉันจะลบไฟล์ของดัชนีที่มากกว่าพูด100 ได้อย่างไร?
คำตอบ:
หากชื่อไฟล์มีหมายเลขตามลำดับเพียงเรียกใช้คำสั่งต่อไปนี้:
rm fileName_{100..100000}
exec
เรียกไปยังจำนวนอาร์กิวเมนต์ที่กระบวนการสามารถมีได้ getconf ARG_MAX
คุณสามารถเรียกมันด้วย เช่นในระบบของฉันมันเป็น2097152
(~ 2.1 ล้าน) ซึ่งหมายความว่าrm
(ซึ่งไม่ใช่ในตัว) จะล้มเหลวมากกว่าไฟล์จำนวนมาก คำสั่งในตัวไม่มีปัญหานี้และไม่เสนอวิธีแก้ไขปัญหาอื่น
คุณอาจลองใช้คำสั่งนี้เช่นกัน
for i in $(seq 100 100000); do rm fileName_$i; done
มันจะลบไฟล์ทั้งหมด (ช่วงจาก 100 ถึง 100,000) ถ้าชื่อไฟล์มีตัวเลขตามลำดับ
โดยทั่วไปคุณมีหลายวิธีในการบรรลุเป้าหมายนี้:
rm fileName_{100..100000}
จะถูกขยายโดยเชลล์เป็นชื่อไฟล์ประมาณ 100,000 ชื่อ ถ้า basename เป็นเส้นทางที่ยาวและมีจำนวนสูงพอคุณอาจเกินความยาวสูงสุดของบรรทัดคำสั่งด้วยวิธีนี้
for
ห่วง
for i in $(seq 100 100000); do rm fileName_$i; done
ไม่ประสบปัญหานี้ แต่เป็นวิธีที่ค่อนข้างช้าในการลบไฟล์เนื่องจากเชลล์ต้องทำการทดแทนตัวแปรและเรียกใช้ rm ประมาณ 100,000 ครั้ง
ทั้งสองวิธีข้างต้นอาจทำให้เกิดการเตือนหากไฟล์บางไฟล์มีว่าfilename_101
หายไป
โดยปกติแล้วโซลูชันที่ใช้งานfind
ได้ดีกว่าเนื่องจากทำงานบนไฟล์ที่มีอยู่จริงเท่านั้น (ระหว่างการค้นพบ) อย่างไรก็ตามมีความแตกต่างเล็กน้อยบางประการ:
find . -name 'fileName_[100-100000]' -exec rm {} \;
จะยังคงเปิดตัวrm
โปรแกรมประมาณ 100,000 ครั้งในขณะที่แทนที่สุดท้าย\;
ด้วย+
จะพยายามลดจำนวนของกระบวนการย่อย ทั้งสองวิธีอาจจะช้ากว่าการใช้ (มากหรือน้อย) -delete
ซึ่งไม่ได้ใช้คำสั่งภายนอกเลย แต่จะเรียกใช้ระบบแทน
อย่างไรก็ตามควรตรวจสอบก่อนเสมอหากรูปแบบนั้นตรงกับไฟล์ที่คุณต้องการกำหนดเป้าหมาย:
stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]'
askubuntu/filename_1
ดังนั้นในกรณีนี้คุณต้องลบไฟล์ที่คุณต้องการเก็บและทิ้งไฟล์ที่ควรถูกลบออก
ใช้คำสั่งต่อไปนี้:
find . -name 'fileName_[100-100000]' -exec rm {} \;
ที่จะลบไฟล์ตั้งแต่ 100 ถึง 100,000
ข้อมูลเพิ่มเติม: เว็บไซต์
[100-100000]
ตัวละครคลาสเท่านั้นตรงกับตัวอักษรตัวเดียวดังนั้นจึงสามารถตรงกับ 0 หรือ 1
{x..y}
ไปยังรายการทั้งหมด ตัวอย่างเช่นถ้าคุณใช้echo test{1..3}
มันจะถูกขยายเป็นecho test1 test2 test3
แล้วดำเนินการtest1 test2 test3
ในขณะที่คุณสามารถดูจะพิมพ์ ในทำนองเดียวกันหาก{x..y}
ไม่ได้เชื่อมต่อกับข้อโต้แย้งใด ๆ ก็จะใส่ตัวเลขที่นั่น เช่นเพียงแค่จะพิมพ์echo test {1..3}
test 1 2 3