[co] หมายถึงอะไรในคำสั่ง“ rm -rf filename [co]”


16

สมมติว่าฉันมีสองไฟล์ใน/tmp:

root@ubuntu:~# touch /tmp/hello.{pyc,py}

root@ubuntu:~# ls /tmp/
hello.py  hello.pyc

ตอนนี้ให้เรียกใช้rm -rfคำสั่งด้วยตัวเลือก [co]

root@ubuntu:~# rm -rf /tmp/hello.py[co]

root@ubuntu:~# ls /tmp/
hello.py

บางคนช่วยอธิบายสิ่งที่เกิดขึ้นที่นี่ได้ไหม? อะไรคือสิ่งที่[co]พารามิเตอร์? เราจะทำให้มันทำงานกับส่วนขยายอื่น ๆ ได้อย่างไร ถ้าฉันมีfoo.jsและfoo.coffeeไฟล์เราสามารถทำสิ่งที่ต้องการrm -rf /tmp/foo.coffe[co]ลบได้/tmp/foo.jsหรือไม่


8
ไม่จำเป็นต้อง-rfมีเนื่องจากไม่มีไดเรกทอรี ( --recursive) หรือไม่สามารถเขียนได้ ( --force)
deltab

13
ไม่จำเป็นต้องทำ-rfและไม่จำเป็นต้องทำในสิ่งที่เป็นราก rm -rfโดยเฉพาะอย่างยิ่งถ้าสิ่งที่อยู่ในคำถามที่เกี่ยวข้องกับ
terdon

พวกมันเป็นเพียงคำสั่งตัวอย่างเพื่ออธิบายปัญหา คำถามจริงเกี่ยวกับ[co]เชลล์ glob ขอบคุณ
aneeshep

8
@aneeshep หากใครบางคนมองปืนกระบอกหนึ่งและถามว่าจะทำความสะอาดได้อย่างไรคุณจะเตือนพวกเขาก่อนเกี่ยวกับการมองลงไปในถังหรือบอกพวกเขาถึงวิธีทำความสะอาด?
Duncan X Simpson

คำตอบ:


34

[co]ไม่ใช่พารามิเตอร์สำหรับrmคำสั่ง - มันคือเชลล์ globที่ตรงกับรูปแบบเท่ากับอักขระเดียวจากชุด[co]- กล่าวอีกอย่างหนึ่งมันตรงกับ a cหรือoจุดสิ้นสุดของชื่อไฟล์ จากman bash:

[...]  Matches any one of the enclosed characters

เพื่อให้ตรงกับทั้งสองfoo.coffeeและfoo.jsเนื่องจากคำต่อท้ายไม่มี substrings ทั่วไปเลยสิ่งที่ดีที่สุดที่คุณทำได้ก็คือการfoo.*จับคู่ชื่อไฟล์ใด ๆ ที่เริ่มต้นด้วยfoo.แทนที่จะใช้วงเล็บปีกกาเช่น

rm foo.{coffee,js}

ใช่เข้าใจแล้ว ฉันพลาดแนวคิดพื้นฐานในการทุบตี;) ขอบคุณ :)
aneeshep

7
รูปแบบการค้นหาเช่น[abc]หรือ*จะค้นหาไฟล์ในขณะที่{}ไม่ใช้ ไปที่ / tmp พิมพ์echo nya[ab]; echo nya{a,b}แล้วจึงtouch nyaaอีกครั้งecho nya[ab]; echo nya{a,b}
Sanya_Zol

16

มันไม่ใช่พารามิเตอร์ แต่เป็นชุดของตัวอักษร (หรือ "shell glob") นี่คือสิ่งเดียวกัน:

rm -rf /tmp/hello.py[co]

เป็นเช่นเดียวกับ

rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo

คล้ายกัน ...

rm -rf /tmp/hello.py[c-o]

จะลบอะไรออกจาก/tmp/hello.pycสูงสุดและรวมถึงการ/tmp/hello.pyoสั่งซื้อ ASCII

rm -rf /tmp/hello.py[ab][cd]

จะลบ ...

rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd

บอกว่าฉันมีไฟล์ foo.js และ foo.coffee เราสามารถทำสิ่งที่ต้องการrm -rf /tmp/foo.coffe[co]ลบ/tmp/foo.jsได้ไหม

คุณสามารถสร้างวิธีการที่ค่อนข้างแปลกใหม่ แต่สำหรับไฟล์ 2 ไฟล์ที่ฉันเพิ่งจะลบด้วย 1 คำสั่งสำหรับแต่ละ อีกตัวอย่างหนึ่งที่ใกล้เคียงที่สุดกับไฟล์ทั้งสอง ...

rm /tmp/foo.[cj]*

จะลบไฟล์เช่นนี้ ...

rm /tmp/foo.c*
rm /tmp/foo.j*

ดังนั้นมันจะรวมมากกว่า 2 ไฟล์เหล่านี้


2
หากฉันไม่ได้เข้าใจผิดคุณจะได้รับการเชิญหนึ่งครั้งrm -rfในการแข่งขันทั้งหมดและไม่ได้ทำการขอร้องจำนวนมากในการแข่งขันนัดเดียว

1
ใช่. แต่ไม่ใช่เจตนาของ rm's i ที่เพิ่มเข้ามา เหล่านั้นเป็นเพียงเพื่อแสดงให้เห็นว่าจะต้องพิมพ์เป็น ;-) เทียบเท่า
Rinzwind

1

มันเป็น glob เปลือกคล้ายกับสัญลักษณ์*และ?... ในการทุบตีรูปแบบชื่อไฟล์*.[co]ตรงกับชื่อไฟล์ทั้งหมดที่จบด้วยหรือ.c.o

ความแตกต่างกับ*.[co]เมื่อเทียบกับ*.c *.oหรือ*.{c,o}เป็นรูปแบบที่สองหลังจะขยายไปยังหลอกตา*.oหากไม่มี.oไฟล์ในไดเรกทอรีในขณะที่*.[co]รุ่นจะไม่

Shell globs มีประโยชน์สำหรับการดำเนินการกับไฟล์โดยไม่คำนึงถึงตัวพิมพ์ใหญ่ - เล็ก ตัวอย่างเช่นถ้าคุณมีพวงของไฟล์ที่มีชื่อไฟล์ที่ลงท้ายด้วยjpg, JPG,Jpg , JPgฯลฯ ... และคุณต้องการที่จะลบทั้งหมดของพวกเขาที่คุณสามารถทำได้

rm *.[Jj][Pp][Gg]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.