FreeBSD: ไดเรกทอรีที่ชื่อว่า ^ C (จริง!) - วิธีลบ


127

ฉันพิมพ์ผิด:

$ history
169 9:34    la /usr/local/etc/
170 9:35    sudo mkdir ^C
171 9:36    sudo mkdir /usr/local/etc/dnsmasq.d

ตอนนี้ฉันมีไฟล์ที่ชื่อ ^ C (ctrl + C) !! เมื่อฉันใช้lsฉันเพิ่งเห็นเครื่องหมายคำถาม (อาจเป็นเพราะสถานที่)

% ls -al
total 60
drwxr-xr-x  2 root   wheel    512 Jan 21 09:35 ?        <- this one
drwxr-xr-x  5 admin  wheel    512 Jan 21 16:24 .
drwxr-xr-x  3 root   wheel    512 Jan 20 14:29 ..
-rw-r--r--  1 admin  nobody  1114 Jan 20 19:10 .cshrc
-rw-------  1 admin  wheel   6002 Jan 21 15:27 .history
-rw-r--r--  1 admin  nobody   182 Jan 20 14:29 .login
-rw-r--r--  1 admin  nobody    91 Jan 20 14:29 .login_conf
-rw-------  1 admin  nobody   301 Jan 20 14:29 .mail_aliases
-rw-r--r--  1 admin  nobody   271 Jan 20 19:04 .mailrc
-rw-r--r--  1 admin  nobody   726 Jan 20 19:05 .profile
-rw-------  1 admin  nobody   212 Jan 20 14:29 .rhosts
-rw-r--r--  1 admin  nobody   911 Jan 20 19:06 .shrc
drwx------  2 admin  nobody   512 Jan 20 15:05 .ssh
drwxr-xr-x  2 admin  wheel    512 Jan 20 19:08 bin

และ

% ls -i
3611537 ?   3611534 bin

ฉันต้องการลบไฟล์นี้ ฉันลองmvและเมื่อใช้การกรอกข้อมูลบนแท็บมันจะแสดง:

% mv
^C/  bin/

เห็นได้ชัดว่าฉันไม่สามารถพิมพ์ ^ C: - / ฉันจะลบไฟล์นี้ได้อย่างไร


11
มันแย่มากที่dswไม่ได้ทำให้เป็น POSIX
Mark Plotnick

12
@ MarkPlotnick: แย่มากที่ต้นฉบับ dswไม่ได้ทำให้เป็น POSIX
Matteo Italia

4
ฉันไม่คิดว่าคุณตั้งชื่อมันว่า ctrl + C คุณตั้งชื่อตามตัวอักษร ASCII ที่แมปกับแป้นพิมพ์ลัดนั้นเช่น ETX (ascii 3) แบบอักษรคอนโซลของคุณไม่มีสัญลักษณ์สำหรับอักขระนั้นดังนั้นจึงใช้สัญลักษณ์แทนที่ "หรือ" ทั่วไป
jiggunjer

5
emacs -nw -f diredให้ไดเรกทอรีนำทาง <kbd> D </kbd> ลบไฟล์ใต้เคอร์เซอร์หลังจากการยืนยัน
Thorbjørn Ravn Andersen

9
@MatteoItalia มันแย่เกินไปที่จะควบคุมตัวละครในชื่อไฟล์และ ความคิดงี่เง่าอื่น ๆทำให้มันกลายเป็น POSIX ...
pipe

คำตอบ:


188

^V( ctrl+ v) ทำงานเป็นชุดลำดับการหลบหนีสำหรับการกดปุ่มครั้งถัดไปโดยแทรกค่าที่เกี่ยวข้องแทนการกระทำสิ่งใดก็ตามที่จะเชื่อมโยงตามปกติ

การใช้สิ่งนี้^V^C( ctrl+ v, ctrl+ c) ควรทำงานเพื่อป้อนชื่อไฟล์ที่ยากของคุณในเทอร์มินัล


41
นี่อาจเป็นวิธีที่ OP ทำผิดในตอนแรก V และ C อยู่ติดกันบนคีย์บอร์ด
เฮมเมอร์

14
หรือพวกเขากำลังพยายามใช้คลิปบอร์ด Windows บนเทอร์มินัล bsd
Joel Coel

2
@JoelCoel นิสัยไม่เคยตาย!
Mafii

1
น่าสนใจ^V^Cใช้งานไม่ได้ใน Zsh line editor ยกใส่วิดเจ็ต (ค้นหาหน้าสำหรับ^V) อย่างชัดเจนไม่ได้แทรกตัวอักษรขัดจังหวะ คำตอบของจาคอบ (ใช้ printf) อาจเป็นวิธีที่สะดวกกว่าในการจัดหาอักขระควบคุมในอาร์กิวเมนต์ของเชลล์
ไมล์

@StigHemmer: สิ่งที่สามารถเกิดขึ้นได้คือคุณกด Ctrl-C ที่อยู่ตรงกลางของคำสั่งจากนั้นลืมเรื่องนี้และคัดลอกคำสั่งวางในภายหลัง
Mehrdad

89

คุณอาจลบไฟล์โดย inode:

$ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete

สิ่งที่คุณทำเพื่อประโยชน์ของพระเจ้าอย่าใส่-deleteก่อน-inum:

$ touch foo bar baz quux
$ find . -name '*u*' -delete
$ ls
bar baz foo
$ find . -delete -name 'b*'
find: `./baz': No such file or directory
find: `./bar': No such file or directory
$ ls
$ 

ขอแสดงความยินดีคุณเพียงแค่เช็ดออกทุกไฟล์ของคุณ ด้วยfind, เรื่องเพื่อโต้แย้ง !


2
ทำไมไม่ใส่-deleteก่อน-inum? นี่เป็นเพียงข้อควรระวังในกรณีที่คุณกดป้อนก่อนกำหนดหรือลำดับของการขัดแย้งมีผลกับผลลัพธ์จริงหรือไม่
detuur

10
@detuur: คำสั่งซื้อมีผลต่อผลลัพธ์ ดูการแก้ไข
บิชอป

37
อย่าใส่-deleteคำสั่งช่วงเวลาจนกว่าคุณจะรันคำสั่งโดยไม่-deleteตรวจสอบว่ามันกำลังค้นหาสิ่งที่คุณต้องการ
Kaz

2
@Kaz จะไม่ช่วยอะไรมากเมื่อเพิ่ม -delete ในใจกลางคำสั่ง
RiaD

9
@Kaz ใช้-printแทน-deleteทำให้การทดสอบที่ดีมาก
Mark Ransom

32

อีกทางเลือกหนึ่งคือการใช้rm -ri ./*; rmจะถามคุณก่อนที่จะลบไฟล์และไดเรกทอรีใด ๆ ดังนั้นคุณเพียงแค่ตอบกลับyไฟล์ "เลวร้าย" และnไปยังไฟล์อื่น ๆ ทั้งหมด

ที่จริงแล้วในกรณีของคุณคุณสามารถลดจำนวนคำตอบที่ต้องทำrm -ri ./?ลงไปเพราะไฟล์ "เลวร้าย" ของคุณมีความยาวเพียงหนึ่งตัวอักษร


8
select f in ?; do rm -i "$f"; break; doneมีประโยชน์ทั้งหมด-iโดยไม่มีความเจ็บปวดจากการตอบคำถามnoที่ไม่พึงประสงค์ชั้นนำหรือตอบใช่กับคนที่คุณต้องการเก็บไว้โดยไม่ตั้งใจ
บิชอป

6
ในกรณีของ OP เป็นไดเรกทอรีไม่ใช่ไฟล์ rmdir ?/จะลบไดเรกทอรีอักขระเดี่ยวที่ว่างเปล่าทั้งหมดและบ่นเกี่ยวกับไดเรกทอรีอื่นที่ไม่ว่างเปล่า
Peter Cordes

2
@ บิชอป: โอ้โหฉันไม่ได้รู้ว่าselectมีอยู่เรียบร้อยสวยมาก!
Matteo Italia

@PeterCordes: wops ฉันไม่ได้สังเกตว่าเรากำลังพูดถึงไดเรกทอรี ฉันเพิ่ม-r(และ./- มันง่ายที่จะลืมเสมอ) ในตัวอย่างของฉันเนื่องจากน่าเสียดายที่rmdirไม่สนับสนุนการ-iตั้งค่าสถานะ ถึงกระนั้นฉันคิดว่าในกรณีนี้วิธีที่ดีที่สุดที่จะไปคือการรวมกันของอธิการและความคิดเห็นของคุณ
Matteo Italia

1
@MatteoItalia selectมีอยู่ในเชลล์บางตัวเท่านั้นซึ่งอาจเป็นเหตุผลว่าทำไมคุณถึงไม่ได้ใช้มัน - สคริปต์และโซลูชันที่ตั้งใจให้พกพาหลีกเลี่ยงได้
mtraceur

23

lsเลือกหนึ่งคือการค้นหาชื่อไฟล์ที่มีสิ่งอื่นที่ไม่ใช่ หากคุณรู้ว่ามันถูกสร้างขึ้นโดย verbatim Ctrl+ Cคุณสามารถค้นหาอักขระ ASCII ที่สร้างขึ้นโดยใช้ตารางของอักขระควบคุมหรือด้วยอินเตอร์เฟสที่เป็นมิตรมากกว่าเช่นที่จัดทำโดย Python:

>>> import os
>>> os.listdir('.')
['\x03', ...]

อีกตัวเลือกหนึ่งที่จะมองไปที่การถ่ายโอนข้อมูลฐานสิบหกของการส่งออกของใช้เช่นlshexdump

จากนั้นคุณสามารถลบไฟล์ด้วย (ตัวอย่าง) คำสั่ง bash นี้:

rmdir "$(printf '\x03')"

(จำเป็นต้องใช้เครื่องหมายคำพูดคู่หากอักขระที่คุณพยายามพิมพ์อยู่ในIFSตัวแปรของคุณเช่น\x20หรือ\x0Aแต่เป็นนิสัยที่ดีในการอ้างอิงการแทนที่คำสั่งยกเว้นว่าคุณรู้ว่าคุณต้องการให้เชลล์ทำการแยกฟิลด์ ฯลฯ )


2
นอกจากนี้cat -v(บวกman ascii) สามารถช่วยในส่วนแรก
Matteo Italia

13
... หรือคุณใช้os.rmdir('\x03')โดยตรงจากเปลือก Python
moooeeeep

15

บ่อยครั้งในสถานการณ์เช่นนี้มันง่ายที่จะเกิดขึ้นกับรูปแบบไวด์การ์ดที่ตรงกับไฟล์ที่เกี่ยวข้อง

ในกรณีของคุณนี่อาจเป็นเพียง?(จับคู่ชื่อไฟล์ทั้งหมดด้วยอักขระหนึ่งตัว)

เพียงตรวจสอบว่ามันตรงกับสิ่งที่คุณต้องการ:

ls -ld ?

แล้วลบไดเรกทอรี:

rmdir ?

นอกจากนี้คุณยังสามารถรวมนี้กับเสร็จแท็บ คุณสามารถพิมพ์

rmdir ?

และกด tab และเช่นใน bash มันจะถูกแทนที่ด้วย

rmdir ^C/

และจากนั้นคุณสามารถกด Enter และทำสิ่งที่คุณต้องการ


11

คุณสามารถใช้ Midnight Commander (mc) เพื่อลบไฟล์ - เพียงแค่เลือกด้วยปุ่มขึ้น / ลงและกด F8

ฉันทำอย่างนั้นเป็นครั้งคราวเมื่อชื่อไฟล์มีอักขระแปลก ๆ เนื่องจากการเข้ารหัส


4
หรือจัดการไฟล์อื่น ๆ
เฮมเมอร์

@ StigHemmer แน่นอนบางคนทำได้ดีกว่าคนอื่น ๆ สำหรับการแสดงชื่อไฟล์บางอย่าง อาจเป็นคำตอบที่สามารถอธิบายได้ว่าเหตุใด MC จึงเป็นตัวเลือกที่ดีที่สุดเมื่อเปรียบเทียบกับคนอื่นที่เลือกไม่กี่คน ฉันไม่รู้เพราะฉันไม่เคยใช้
can-ned_food

7

วิธีอื่น: ใช้statเพื่อรับการแสดงแทนชื่อไดเรกทอรี:

$ stat *|grep File:
  File: ‘\003’

ตอนนี้คุณรู้ถึงการแสดงชื่อไฟล์ดังนั้นคุณสามารถลบไฟล์ตามชื่อโดยใช้printf:

$ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’

หรือถ้าคุณใช้ bash คุณสามารถหลีกเลี่ยงprintf:

$ rmdir -v $'\003'
rmdir: removing directory, ‘\003’

BTW ถ้าเชลล์เป็น bash $'\x03'จะง่ายกว่าการเรียก printf เช่นเดียวกับ FreeBSD sh ที่ขยายผ่าน POSIX เชลล์ด้วยคุณสมบัติที่ยอดเยี่ยม
Netch

@ ดึงจุดที่ดีเกี่ยวกับทุบตี$'...'แต่ฉันจะหลีกเลี่ยงการแปลงไร้ประโยชน์จากฐานแปดถึงเลขฐานสิบหกโดยทั่วไป เช่นจะเกิดอะไรขึ้นถ้าไฟล์มีชื่อ'\111'(เป็นstatเอาท์พุท) คุณยังจะลบออกโดยใช้$'\x49'หรือไม่ ดีกว่าใช้ลำดับเช่นเดียวกับที่statให้คุณ: ในกรณีที่ OP rmdir $'\003'ของ
Ruslan

6

ทางออกสำหรับฉันคือ:

rm ./[Tab][Tab][Tab]...

เพื่อวนไฟล์ที่มีอยู่จนกว่าฉันจะพบไฟล์ที่ฉันต้องการลบ

แต่คุณจำเป็นต้องมีการตั้งค่าที่จำเป็นในเชลล์เพื่อให้สามารถใช้งานได้


^ C เร็วมากในลำดับแท็บดังนั้น +1 สำหรับคุณ
joshudson

5

rm -r DIRNAMEวิธีที่ง่ายที่สุดคือการย้ายทุกอย่างเพื่อไดเรกทอรีชั่วคราวแล้ว


7
นี่ดูเหมือนคุณจะง่ายกว่าคำตอบที่ยอมรับหรือไม่?
ลูกไก่

2
@ ลูกไก่: จริงๆแล้วมันไม่ใช่คำตอบที่ไม่ดีเลย ฉันเห็น ^ V ^ C ไม่ทำงานดังนั้นบางคนอาจติดขัด
joshudson

มันไม่ได้ผิดปกติ แต่ดูเหมือนว่าจะมีงานพิเศษมากมายเมื่อเทียบกับโซลูชั่นที่ตรงกว่า บางทีฉันอาจถูกลินุกซ์โดย Linux แต่^vก็ทำงานให้ฉันมานาน
ลูกไก่

6
@ ลูกไก่^Vต้องการความรู้ที่เฉพาะเจาะจงในขณะที่ย้ายไฟล์ไปรอบ ๆ และการกำจัดไดเรคทอรี่หลักสามารถได้มาจากพื้นฐาน
Kondybas

5
Ctrl + V มีความคลุมเครือที่เป็นอันตรายขึ้นอยู่กับสภาพแวดล้อมการทำงานที่แน่นอนของคุณ ... ผู้เลียนแบบเครื่องเทอร์มินัลบางคนสามารถตีความได้ว่าเป็นการวาง หากบัฟเฟอร์การวางของคุณมีชื่อของสิ่งที่คุณไม่ต้องการลบ - และขึ้นบรรทัดใหม่คุณอาจกำลังดูปัญหา
rackandboneman

1

ถ้ามันเป็นเพียงไดเรกทอรีที่ว่างเปล่า (หรือคุณไม่สนใจเกี่ยวกับการลบไดเรกทอรีว่างอื่น ๆ ), การใช้งาน rmdir */คุณจะได้รับข้อความแสดงข้อผิดพลาดrmdirเกี่ยวกับการไม่สามารถลบไดเรกทอรีที่ไม่ว่างเปล่า แต่ก็ใช้ได้ GNU rmdirสนับสนุนหรือคุณอาจจะ--ignore-fail-on-non-empty2>/dev/null

การตามรอย/ทำให้ glob ตรงกับชื่อไดเรกทอรีเท่านั้น


find -maxdepth 1 -type d -empty -lsคุณสามารถตรวจสอบก่อนเวลาสิ่งที่ไดเรกทอรีว่างอยู่ภายใต้หนึ่งในปัจจุบันใช้ (และคุณสามารถเปลี่ยน-lsไป-deleteถ้าคุณต้องการ)

คุณสามารถใช้นิพจน์ glob เฉพาะเจาะจงมากขึ้นเช่นrmdir [^A-Za-z0-9._]/จับคู่ไดเรกทอรีที่ขึ้นต้นด้วยชื่อไฟล์ที่ไม่ใช่ตัวอักษรและตัวเลขหรือขีดล่าง ฉันรวมอยู่ด้วย.แต่การแสดงออกแบบกลมไม่ตรง.ตามปกติ


ตามที่คนอื่น ๆ ได้ชี้ให้เห็นคุณสามารถ จำกัด ให้เป็นชื่อตัวละครเดียวด้วย glob ของ?: rmdir ?/

rmdirไม่มี-iตัวเลือกในแบบที่rmเป็นไปได้เนื่องจากสันนิษฐานว่าไดเรกทอรีที่ว่างเปล่ามักจะไม่มีค่าและสามารถสร้างใหม่ได้


1
คุณต้องการทราบว่าไดเรกทอรีใดที่คุณต้องการสร้างใหม่และrmdirสามารถบอกคุณได้ว่าคุณผ่าน-vตัวเลือกไปหรือไม่ (อย่างน้อยก็ใน GNU)
Ruslan

@Ruslan: ไม่ถ้าคุณมีไดเรกทอรีเก่าอื่น ๆ ที่คุณไม่สนใจอีกต่อไปและการลบออกจะเป็นโบนัส คุณสามารถค้นหาไดเรกทอรีว่างด้วยfind -maxdepth 1 -type d -empty -ls
Peter Cordes

-1

ก่อนที่จะทำสิ่งใดที่มีความเสี่ยงลองทำสิ่งนี้ก่อน:

rmdir -- ^C

โดยทั่วไป - เป็นตัวคั่นที่บอกว่าคำสั่ง -o ptions จะไม่ทำตาม แต่จะอนุญาตให้อักขระแปลก ๆ ไม่ได้รับการตีความว่าเป็นอย่างอื่น

อีกตัวอย่างการใช้งานคือ whois -r -- "-r OBJECT-RIPE"

(-r เป็นทางลัดสำหรับการสุก แต่ในการสุก whois ยังเป็นพารามิเตอร์)

หากไม่ได้ลองครั้งแรกอาจลอง rmdir -- "^C"

แต่ที่เปลือก csh ของฉันฉันไม่ต้องการอะไรเลยมันrmdir ^Cใช้ได้กับฉันแล้ว


1
ในการพิมพ์ csh rmdir ตามด้วย <ctrl> C ใช้ได้ไหม จริงๆ?! ฉันคาดว่ามันจะทำงานแตกต่างกันคือยกเลิกrmdirคำสั่งและกลับไปที่ commandline
Mausy5043

มันจะแน่นอน ดูคำตอบที่ยอมรับเกี่ยวกับวิธีป้อนอักขระ ^ C บนบรรทัดคำสั่ง
Ale
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.