ฉันจะลบไฟล์ที่ชื่อขึ้นต้นด้วย“ -” (เครื่องหมายขีดกลางหรือขีดกลาง) ได้อย่างไร


348

คุณจะลบไฟล์ที่ชื่อไฟล์เริ่มต้นด้วยเครื่องหมายขีดกลาง (ขีดกลางหรือลบ) ได้-อย่างไร ฉันจะเข้าสู่เซิร์ฟเวอร์ OSX ระยะไกลและฉันมีไฟล์นี้ในไดเรกทอรีของฉัน:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

ฉันจะลบ--helpจาก CLI ได้อย่างไรในโลก ปัญหานี้เป็นสิ่งที่ฉันเจอในรูปแบบที่แตกต่างกันในบางโอกาสไฟล์เหล่านี้ง่ายต่อการสร้าง แต่ยากที่จะกำจัด

ฉันได้ลองใช้แบ็กสแลช

rm \-\-help

ฉันได้ลองเสนอราคา

rm "--help"

ฉันจะป้องกันไม่ให้อักขระลบ (ขีดกลางหรือเครื่องหมายขีดคั่น) เป็นตัวเลือกได้อย่างไร


1
จะดีถ้าคำถามนี้ถูกเปลี่ยนชื่อเป็น "วิธีลบไฟล์ที่ชื่อขึ้นต้นด้วย -"
Sandy

@ แซนดี้ตกลง ปกติแล้วฉันไม่ชอบการเปลี่ยนแปลงความหมายของคำถาม แต่ในกรณีนี้คำตอบที่ยอมรับนั้นมีความเฉพาะเจาะจงกับปัญหานี้
Michael Mrozek

33
ฉันคิดว่ามันเป็นบิตแดกดันว่าจริงอธิบายถึงวิธีการลบชื่อไฟล์ที่เริ่มต้นด้วยrm --help -คำถามที่ดี แต่
lesmana

1
@ jw013 บางครั้งความช่วยเหลือเป็นเรื่องง่ายสำหรับผู้ใช้ที่มีประสบการณ์ในการทำความเข้าใจ แต่ทำให้รู้สึกสับสนและสับสน
iconoclast

1
ฉันพบสิ่งนี้บนระบบที่ใช้ rm จาก BusyBox ทุกอย่างมีน้อยรวมถึงความช่วยเหลือดังนั้น rm - ช่วยไม่ได้ให้เบาะแสใด ๆ
dslake

คำตอบ:


497

ใช้ "-" เพื่อให้ตัวเลือกบรรทัดคำสั่ง rm หยุดการแยกวิเคราะห์เช่นนี้:

rm -- --help

1
ผมรู้ว่ามันเป็นสิ่งที่ง่ายมากเช่นนี้ ...
ไบรอัน Rehbein

2
rmคำสั่งทุกเวอร์ชันรองรับ--อาร์กิวเมนต์หรือไม่
Keith Thompson

3
@ KeithThompson - เป็นคุณลักษณะของเครื่องมือ GNU ส่วนใหญ่ดังนั้นจึงไม่สามารถทำงานกับส่วนที่ไม่ใช่ GNU ("non-Linux") Unix'es (เช่นรุ่น BSD หรือระบบฝังตัวบางตัว)
dtech

1
ขอขอบคุณ! นั่นช่วยชีวิตฉันไว้ และแน่นอนมันใช้งานได้กับ BSD (OSX) และด้วยคำสั่งอื่น ๆ !
raskhadafi

8
@dtech, getopt () และ--predate GNU (SysIII, 1980) และเป็นมาตรฐาน / POSIX สาธารณูปโภคมาตรฐานยกเว้นข้อยกเว้นบางประการ (ชอบecho) --เข้าใจ YMMV สำหรับคำสั่งอื่น ๆ หากไม่ได้ใช้ getopt () API เพื่อแยกวิเคราะห์ตัวเลือก
Stéphane Chazelas

213

หรือคุณสามารถทำได้

rm ./--help

7
ไม่ใช่ว่ามันสำคัญ แต่ดูเหมือนว่า "เหมาะสมที่สุด"
James M.

2
นี่คือสิ่งที่ฉันจำได้ ใช้ "rm - - ความช่วยเหลือ" เป็นสิ่งที่ฉันต้องค้นหา
user603

25
วิธีนี้ใช้ได้เสมอแม้กับคำสั่งที่ไม่ได้ปฏิบัติ--เป็นพิเศษ
jw013

และก็ยังทำงานเพื่อหลีกเลี่ยงการรักษาพิเศษโดยคำสั่งบางประเภทอื่น ๆ (ข้างตัวเลือก) ของอาร์กิวเมนต์ที่มีชื่อเป็นพิเศษเช่น-สาธารณูปโภคข้อความหรือcdที่foo=barของawk...
Stéphane Chazelas

1
สิ่งนี้จะทำงานเมื่อไฟล์เริ่มต้นด้วยเส้นประเดียวซึ่งrm -- <filename>ไม่ได้
StockB

37

ใช้findเพื่อทำมัน:

find . -name '--help' -delete

และนี่เป็นวิธีการที่ดีเพราะถ้าคุณมีไฟล์มากกว่าสองสามไฟล์เช่นนี้ที่คุณสามารถลบคุณสามารถรับรายการตัวอย่างของไฟล์โดยเรียกใช้ find โดยไม่มี-deleteตัวเลือกก่อนจากนั้นถ้ารายการไฟล์ดูดีแค่รัน -deleteมันอีกครั้งกับ

ในความเป็นจริงคุณหลีกเลี่ยงrmในความโปรดปรานของfind(โดยเฉพาะอย่างยิ่งกับการแสดงตัวอย่างแรก) เป็นนิสัยที่ดีที่จะช่วยให้คุณหลีกเลี่ยงความผิดพลาดกับrm *ที่ย่อมจะกัดคุณบางวัน

แต่โปรดทราบว่าการค้นหานั้นจะหักล้างผ่านไดเรกทอรีย่อยทั้งหมดของคุณดังนั้นคุณอาจต้องการเรียกใช้โดยมีข้อ จำกัด เชิงลึกของไดเรกทอรีย่อยดังนี้:

find . -maxdepth 1 -name '--help' -delete

ซึ่ง จำกัด การค้นหาไปยังไดเรกทอรีปัจจุบัน


แบบพกพาคุณต้องให้findรายการของไฟล์ / dirs เพื่อดู find . -name...ดังนั้น -deleteและ-maxdepthไม่ใช่ตัวเลือกมาตรฐานเช่นกัน
Stéphane Chazelas

21

คำตอบของ Vegar Nilsen และ edfuh นั้นดีมากและเป็นทางออกที่เหมาะสมสำหรับปัญหาเช่นนี้

ฉันต้องการเพิ่มการตอบกลับทั่วไปสำหรับคำถามนี้ที่อนุญาตให้คุณลบไฟล์ใด ๆ ที่มีชื่อไฟล์ยาก อันดับแรกคือรับหมายเลข inode โดยใช้ls -iหรือรูปแบบบางส่วนจากstatนั้นไฟล์จะถูกลบออกโดยการค้นหาไฟล์ในไดเรกทอรีปัจจุบันด้วยหมายเลข inode และดำเนินการrmคำสั่งในไฟล์ที่มีหมายเลข inode ตรงกัน

find . -inode <inode> -exec rm {}\;

เนื่องจากหมายเลข inode นั้นไม่เหมือนใครในแต่ละระบบไฟล์คุณสามารถลบไฟล์ใด ๆ ที่ใช้สิ่งนี้; ยูนิโค้ดหรือใช้ตัวละครหนี มันน่ารำคาญมากที่จะพิมพ์ออกมาดังนั้นฉันขอแนะนำให้เพิ่มบรรทัด

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

เป็น.inputrcไฟล์ของคุณหากคุณใช้ทุบตี สิ่งนี้ช่วยให้คุณสามารถวนรายการความสำเร็จที่เป็นไปได้ ( สำหรับข้อมูลเพิ่มเติม )


5
วิธีนี้มีสองปัญหา: 1) อย่าใช้ -exec rm เมื่อคุณสามารถใช้ -delete; 2) การได้รับ inode และการใช้ที่ไม่ซับซ้อนเกินความจำเป็นเมื่อคุณสามารถใช้:find -name '--help' -delete
aculich

ฉันไม่คิดว่ามันจะได้ผล มันสำรวจไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมดและหลังจากนั้นก็ยังคงเรียกใช้rm --helpซึ่งยังคงไม่ลบไฟล์ เพียงใช้rm ./--help(หรือrm -i *.
Keith Thompson

1
@KeithThompson findคำนำหน้าเส้นทางอาร์กิวเมนต์บรรทัดคำสั่งไฟล์ทั้งหมดจึงจะทำงานและrm ./--help rm ./sub/dirs/--helpในการแก้ไขครั้งที่สองเราจะต้องเพิ่ม-maxdepth 1แต่ทั้งหมดนี้คือการใช้วิธีแก้ปัญหาของ @ edfuh ในวงเวียนที่ซับซ้อนและ-deleteมีความปลอดภัยและปลอดภัยกว่า-exec rmอย่างไรก็ตาม
jw013

1
อีกปัญหาหนึ่งของคำสั่งนี้คือจะต้องมีช่องว่างระหว่าง{}และ\;มิฉะนั้นจะไม่ทำงาน
Eugene S

inodesอาจไม่ซ้ำกัน แต่อาจมีหลายรายการไดเรกทอรีที่มี inode เดียวกัน สิ่งเหล่านี้เรียกว่า hardlinks -xdevและพวกเขากำลังเพียงไม่ซ้ำกันต่อระบบไฟล์เพื่อให้คุณจะต้องใช้ นั่นจะไม่ช่วยให้คุณทำงานls -i --helpได้
Stéphane Chazelas


8

Linux Walkthrough ในการสร้างไฟล์ที่มีขีดกลางและเว้นวรรคแล้วจึงลบออก

ระวัง! อย่าเรียกใช้rm -rf /คำสั่งลบแบบเรียงซ้อนหรือคล้ายกันโดยไม่ตั้งใจ

หากไฟล์ของคุณที่คุณกำลังพยายามที่จะลบรวมถึงเครื่องหมายดอกจันหรือเครื่องหมายไม่ตั้งใจปั๊ม.หรือ/*หรือ*หรือสัญลักษณ์แทนอื่น ๆ ซึ่งอาจน้ำตกลบระบบปฏิบัติการของคุณ

สร้างไฟล์ชื่อ "--yo yo"

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

ก่อนอื่นให้ค้นหาด้วย find:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

ตรวจสอบให้แน่ใจว่าคำสั่ง find พบไฟล์ ONE ที่คุณต้องการลบเท่านั้น:

จากนั้นผ่านตัวเลือก -delete เพื่อค้นหาเพื่อลบ:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

เอาเป็นว่ามันหายไปแล้ว


2

Midnight Commander ( mc) เป็นวิธีที่ง่ายที่สุดเพียงแค่ชี้ไปที่มันแล้วกด F8;)


3
OP ต้องการโซลูชันบรรทัดคำสั่ง (CLI)
Francesco Turco

1
Midnight Commander IS เป็นโซลูชั่น CLI เพียงใช้แพ็คเกจผู้จัดการของคุณเพื่อติดตั้ง (สามารถใช้งานได้กับ ssh ... ) en.wikipedia.org/wiki/Midnight_Commander
daviewales

6
เป็นวิธีการที่apt-get install mc || yum install mc; mc ปุ่มลูกศรต่างๆและ F8ง่ายกว่าrm ./--help?
Josh

3
@daviewales: Midnight Commander เริ่มต้นจากบรรทัดคำสั่งและมันทำงานในเทอร์มินัล แต่การกระทำของแป้นพิมพ์ทั้งหมดภายใน Midnight Commander ไม่ได้มาจาก CLI (Command Line Interface) - มาจากอินเทอร์เฟซผู้บัญชาการ Midnight - โดยทั่วไปโปรแกรมอรรถประโยชน์บรรทัดคำสั่งสามารถเรียกใช้ภายในสคริปต์ (ข้อยกเว้นคือประวัติบรรทัดคำสั่งทุบตี)
Peter.O

1

นี่เป็นวิธีแก้ปัญหาที่ฉันใช้ก่อนค้นหาเธรดนี้
ใช้vimเพื่อ 'แก้ไข' ไดเรกทอรี:

vim .

จากนั้น (เป็นกลุ่ม) เลือกไฟล์ของคุณกดปุ่มลบและยืนยันการลบ
เมื่อคุณออกจากกลุ่มด้วย:q


0

คุณพยายามเพิ่มชื่อไดเรกทอรีเป็นคำนำหน้า:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

การใช้ไดเรกทอรีเป็นส่วนนำหน้าของไฟล์โดยทั่วไปจะช่วยหลีกเลี่ยงการตีความอักขระ "ลบ" อย่างผิดพลาดเป็นตัวเลือกคำสั่งโดยฟังก์ชัน parser


1
ฉันเชื่อว่านี่เป็นคำตอบก่อนหน้านี้แล้ว
Kusalananda

-3

หากคุณต้องการเปลี่ยนชื่อไฟล์-.bar, (mv ใช้งานไม่ได้) ให้ลองสิ่งนี้:

cat >foo.bar <-.bar

ก่อนที่จะใช้คำสั่ง:

rm -- -.bar

คุณควรตรวจสอบเนื้อหาของไฟล์ต้นฉบับใน foo.bar


4
การทำสำเนาไฟล์ไม่ใช่วิธีที่มีประสิทธิภาพมากสำหรับการเปลี่ยนชื่อไฟล์
jw013

1
คุณสามารถใช้ vidir; แต่นั่นอาจเป็นเพียงแค่ (หรือมากกว่า) ที่ไม่มีประสิทธิภาพ - และเป็นอันตรายมากขึ้น
Stephen Menasian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.