ฉันจะลบไฟล์ทั้งหมดที่มีนามสกุลเฉพาะในโฟลเดอร์ใดโฟลเดอร์หนึ่งได้อย่างไร


36

ถ้าฉันตั้งค่าไดเรกทอรีปัจจุบัน / ทำงาน (นำทางไปใช้มันcd) ไปยังไดเรกทอรีเฉพาะบางประเภทแล้วพิมพ์:

rm *.xvg

คำสั่งนี้จะทำอะไร? มันเป็นความจริงว่าคำสั่งดังกล่าวจะเพียงลบไฟล์ที่มีนามสกุล.xvg เฉพาะในไดเรกทอรีการทำงานหรือไม่

ฉันกังวลเกี่ยวกับการลองก่อนที่จะถามเพราะฉันต้องการให้แน่ใจว่าคำสั่งดังกล่าวจะลบ.xvgไฟล์ที่อยู่ในไดเรกทอรีการทำงานเท่านั้น

คำตอบ:


34

ใช่rm *.xvgจะมีเพียงลบไฟล์ที่มีนามสกุลที่ระบุไว้ในปัจจุบันไดเรกทอรี

ดีวิธีที่จะทำให้แน่ใจว่าคุณเป็นจริงในไดเรกทอรีที่คุณต้องการลบไฟล์ของคุณคือการใช้pwdคำสั่งซึ่งจะแสดงไดเรกทอรีปัจจุบันของคุณและจากนั้นทำlsเพื่อตรวจสอบคุณพบไฟล์ที่คุณจะคาดหวังว่า

หากคุณมีความกังวลเล็กน้อยเกี่ยวกับการออกrmคำสั่งมี 2 สิ่งที่คุณสามารถทำได้:

  1. พิมพ์ls *.xvgเพื่อดูรายการไฟล์ที่จะได้รับผลกระทบจากคำสั่งนี้

  2. หากคุณไม่มีไฟล์จำนวนมากคุณสามารถใช้-iสวิตช์บรรทัดคำสั่งสำหรับrm(มีอยู่สำหรับcpและmv) ได้เช่นกัน การใช้rm -i *.xvgจะแจ้งให้คุณทราบสำหรับแต่ละไฟล์หากการลบนั้นเป็นเรื่องปกติดังนั้นคุณจึงมั่นใจได้ว่าไม่มีสิ่งใดที่คุณไม่คาดคิดว่าจะถูกลบ (สิ่งนี้จะน่าเบื่อถ้าคุณมีไฟล์จำนวนมาก :)


1
ยัง: rm -f {*.xvg,.*.xvg}เพื่อลบไฟล์ที่ซ่อนอยู่ และrm -R -f {*.xvg,.*.xvg}เพื่อลบไดเรกทอรีด้วย
Dor

20

คุณไม่จำเป็นต้องไปที่ dir เพียงใช้

rm /some/dir/*.xvg 

ในกรณีที่คุณพิมพ์ผิดหรือมีความผิดพลาดคล้ายกันในเส้นทางไม่มี / som / dir อยู่:

cd /som/dir
rm *.xvg

จะเผลอลบ. xvg-files ทั้งหมดใน dir ปัจจุบัน คำสั่งแรกจะไม่และคุณไม่จำเป็นต้องย้อนกลับไปอีกครั้ง

อีกทางเลือกหนึ่งคือใช้ find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 

find / some / dir / -maxdepth 1 -type f -name "* .xvg" -delete ทำงานให้ฉัน! ใช้ -maxdepth "n" ไปยังไฟล์ที่ตรงกันลบในไดเรกทอรีย่อยหากได้รับเส้นทาง
Vinay

3

ใช่rm *.xvgจะลบไฟล์ที่ลงท้ายด้วย.xvgในไดเรกทอรีปัจจุบันของคุณเท่านั้น นี่คือเหตุผล

เมื่อคุณพิมพ์คำสั่งเช่นนี้งานจะถูกแบ่งระหว่างเชลล์ที่คุณใช้ (สมมติว่าใช้ bash) และไบนารีคำสั่ง

which rmคุณสามารถค้นหาไบนารีโดยการพิมพ์ โปรแกรมเล็ก ๆ นี้ดูแลการยกเลิกการเชื่อมโยงไฟล์ โปรแกรมเช่นนี้สามารถเริ่มต้นได้จากบรรทัดคำสั่งและสามารถอ่านรายการอาร์กิวเมนต์prog arg1 arg2 arg3เมื่อเริ่มต้น ในกรณีของไฟล์rmเหล่านั้นจะถูกตีความเป็นรายการชื่อไฟล์ที่ผ่านการรับรองโดยสมบูรณ์เพื่อลบ ดังนั้นถ้าคุณอยู่ในไดเรกทอรีที่มีไฟล์foo.barพิมพ์จะส่งผลให้delete 'foo.*' rm: foo.*: No such file or directoryสังเกตเครื่องหมายคำพูดเดี่ยวรอบ ๆ รูปแบบไฟล์โดยบอกให้เชลล์ส่งอาร์กิวเมนต์ไปยังเชลล์ตามที่เป็นอยู่

อย่างไรก็ตามหากคุณพิมพ์rm *.barในไดเรกทอรีเดียวกันมันจะลบไฟล์ สิ่งที่เกิดขึ้นที่นี่คือเชลล์ของคุณซึ่งเป็นโปรแกรมที่คุณใช้พิมพ์คำสั่งทำการแปลงบางอย่างก่อนส่งอาร์กิวเมนต์ไปยังคำสั่ง หนึ่งในนั้นเรียกว่า 'การขยายชื่อไฟล์' มิฉะนั้นจะรู้ว่าเป็น 'การวนซ้ำ' คุณสามารถดูรายการของไฟล์ทุบตีขยายชื่อที่นี่ หนึ่งในการขยายที่พบมากที่สุดคือ*ซึ่งขยายไปยังชื่อไฟล์ในไดเรกทอรีปัจจุบัน

วิธีง่ายๆในการดู globs ในที่ทำงานคือการใช้echoซึ่งจะพิมพ์กลับอาร์กิวเมนต์ทั้งหมดที่ส่งไปยังมันผ่านเปลือก ดังนั้นการพิมพ์ในออกจะไดเรกทอรีเดียวกันecho * foo.barดังนั้นเมื่อคุณพิมพ์rm *.barสิ่งที่เกิดขึ้นจริงคือเชลล์ขยายรายการอาร์กิวเมนต์ไปที่foo.barจากนั้นส่งผ่านไปยังrmคำสั่ง

มีวิธีการบางอย่างในการควบคุมกลม ในเวอร์ชันล่าสุดของ bash เช่นคุณสามารถเปิดตัวเลือกที่เรียกว่า globstar ซึ่งจะทำการขยายซ้ำ การพิมพ์echo **/*.barจะแสดงรายการไฟล์ทั้งหมดที่ลงท้ายด้วย.barโฟลเดอร์ย่อยทั้งหมด ดังนั้นการพิมพ์rm **/*.barใน bash ที่เปิดใช้งาน globstar จะเป็นการลบไฟล์ที่ตรงกันทั้งหมดซ้ำในโฟลเดอร์ย่อย


1

คำสั่ง:

  rm ./*.pgm

ทำงานได้สำหรับฉัน

คำสั่ง:

rm *.pgm

ให้คำสั่งข้อผิดพลาด (เป็นภาษาโปแลนด์แปล):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

ใน

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.