การลบไฟล์เฉพาะในบรรทัดคำสั่ง


8

ฉันมีไฟล์fileName_1 , fileName_2 ... fileName_100000โดยที่ fileNames จะถูกกำหนดหมายเลขตามลำดับ ฉันจะลบไฟล์ของดัชนีที่มากกว่าพูด100 ได้อย่างไร?

คำตอบ:


17

หากชื่อไฟล์มีหมายเลขตามลำดับเพียงเรียกใช้คำสั่งต่อไปนี้:

rm fileName_{100..100000}

3
ข้อมูล: ใช้งานได้เพราะทุบตี (เปลือกของคุณ) จะขยาย{x..y}ไปยังรายการทั้งหมด ตัวอย่างเช่นถ้าคุณใช้echo test{1..3}มันจะถูกขยายเป็นecho test1 test2 test3แล้วดำเนินการ test1 test2 test3ในขณะที่คุณสามารถดูจะพิมพ์ ในทำนองเดียวกันหาก{x..y}ไม่ได้เชื่อมต่อกับข้อโต้แย้งใด ๆ ก็จะใส่ตัวเลขที่นั่น เช่นเพียงแค่จะพิมพ์echo test {1..3} test 1 2 3
Luc

1
หมายเหตุ: มีข้อ จำกัด ที่กำหนดโดยการexecเรียกไปยังจำนวนอาร์กิวเมนต์ที่กระบวนการสามารถมีได้ getconf ARG_MAXคุณสามารถเรียกมันด้วย เช่นในระบบของฉันมันเป็น2097152(~ 2.1 ล้าน) ซึ่งหมายความว่าrm(ซึ่งไม่ใช่ในตัว) จะล้มเหลวมากกว่าไฟล์จำนวนมาก คำสั่งในตัวไม่มีปัญหานี้และไม่เสนอวิธีแก้ไขปัญหาอื่น
Bakuriu

โปรดทราบว่า ARG_MAX เป็นจำนวนไบต์ไม่ใช่จำนวนอาร์กิวเมนต์ rm ไม่สามารถจัดการกับการลบไฟล์ 2097152 ในครั้งเดียว มันสามารถลบไฟล์ 2048 ซึ่งแต่ละไฟล์มีชื่อที่มีความยาว 1,023 ไบต์ (ไม่ใช่ 1024 ตัวคั่นระหว่างอาร์กิวเมนต์ (\ 0 ใน C-land) จะนับรวมอยู่ในขีด จำกัด )
godlygeek

6

คุณอาจลองใช้คำสั่งนี้เช่นกัน

for i in $(seq 100 100000); do rm fileName_$i; done

มันจะลบไฟล์ทั้งหมด (ช่วงจาก 100 ถึง 100,000) ถ้าชื่อไฟล์มีตัวเลขตามลำดับ


5

โดยทั่วไปคุณมีหลายวิธีในการบรรลุเป้าหมายนี้:

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

ดังนั้นในกรณีนี้คุณต้องลบไฟล์ที่คุณต้องการเก็บและทิ้งไฟล์ที่ควรถูกลบออก


4

ใช้คำสั่งต่อไปนี้:

find . -name 'fileName_[100-100000]' -exec rm {} \;

ที่จะลบไฟล์ตั้งแต่ 100 ถึง 100,000

ข้อมูลเพิ่มเติม: เว็บไซต์


คุณต้องการจะดีกว่าการใช้+มากกว่า\;- ดูที่นี่ หรือยิ่งกว่านั้นให้ใช้-deleteคำสั่งfind
evilsoup

ฉันทดสอบสิ่งนี้แล้วและจะลบเฉพาะ fileName_1 [100-100000] ตัวละครคลาสเท่านั้นตรงกับตัวอักษรตัวเดียวดังนั้นจึงสามารถตรงกับ 0 หรือ 1
deltab
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.