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 में नहीं बनाया।
मार्क प्लॉटनिक

12
@MarkPlotnick: बहुत बुरा मूल यह POSIX में नहीं किया। dsw
मट्टियो इटालिया

4
मुझे नहीं लगता कि आपने इसका नाम ctrl + C रखा है, आपने इसका नाम उस एससीआई कैरेक्टर के नाम पर रखा है, जो संभवत: उस कीबोर्ड शॉर्टकट यानी ETX (ascii 3) से मैप किया गया है। आपके कंसोल फ़ॉन्ट में उस वर्ण के लिए कोई ग्लिफ़ नहीं है, इसलिए यह एक सामान्य प्रतिस्थापन ग्लिफ़ "?" का उपयोग करता है।
जिग्गंजर

5
emacs -nw -f diredएक निर्देशिका नाविक देता है। पुष्टि के बाद <kbd> D </ kbd> कर्सर के तहत फ़ाइल को हटा देता है।
थोरबजोरन राव एंडरसन

9
@MatteoItalia यह फ़ाइल नाम और अन्य मूर्ख विचारों में बहुत बुरा नियंत्रण वर्ण है इसे POSIX में बनाया ...
पाइप

जवाबों:


188

^V( ctrl+ v) अगले की-प्रेस के लिए एक प्रकार का एस्केप सीक्वेंस के रूप में काम करता है, जो भी सामान्य रूप से जुड़ा होगा जो भी कार्रवाई करने के बजाय संबद्ध मूल्य सम्मिलित करता है।

, इस का इस्तेमाल कर रही ^V^C( ctrl+ v, ctrl+ c) टर्मिनल में अपने कठिन फ़ाइल नाम दर्ज करने के लिए काम करना चाहिए।


41
शायद यह था कि कैसे ओपी ने पहली बार में अपना टाइपो बनाया। कीबोर्ड पर V और C एक दूसरे के ठीक बगल में हैं।
स्टिग हेमर

14
या वे bsd टर्मिनल पर विंडोज क्लिपबोर्ड का उपयोग करने की कोशिश कर रहे थे।
जोएल कोएल

2
@JoelCoel की आदतें कभी नहीं मरती हैं!
माफिया

1
दिलचस्प है, Zsh लाइन संपादक में काम नहीं^V^C करता है ; उद्धृत-डालने विजेट (के पृष्ठ की खोज ) स्पष्ट रूप से बाधा वर्ण सम्मिलित नहीं है। जैकब का उत्तर (प्रिंट का उपयोग करके) शेल तर्क में एक नियंत्रण चरित्र की आपूर्ति करने का अधिक पोर्टेबल तरीका हो सकता है। ^V
माइल्स

@StigHemmer: क्या हो सकता है आप एक कमांड के बीच में Ctrl-C दबाएं, फिर इस बारे में भूल जाएं और बाद में कमांड को कॉपी-पेस्ट करें।
मेहरदाद

89

आप फ़ाइल को इनोड द्वारा भी हटा सकते हैं:

$ 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यह जांचने के लिए कि आप क्या चाहते हैं , तब तक इसे कमांड, अवधि में न डालें ।
कज़

2
@ काज कमांड के केंद्र में जोड़ने के साथ बहुत मदद नहीं करेगा
रियाद

9
@ काज का उपयोग -printकरने के बजाय -deleteएक बहुत अच्छा परीक्षण करता है।
मार्क रैनसम

32

एक अन्य विकल्प का उपयोग करना है rm -ri ./*; rmकिसी भी फ़ाइल और निर्देशिका को हटाने से पहले आपसे पूछेगा, इसलिए आपको बस y"खराब" फ़ाइल, और nअन्य सभी को जवाब देना होगा।

दरअसल, आपके मामले में आप कर की जरूरत के जवाबों की संख्या में कटौती कर सकते हैं rm -ri ./?, क्योंकि आपकी "खराब" फ़ाइल सिर्फ एक वर्ण लंबी है।


8
select f in ?; do rm -i "$f"; break; doneअग्रणी अवांछनीयताओं -iका जवाब देने के noलिए या गलती से जवाब देने के लिए बिना किसी के हाँ करने की पीड़ा के बिना, के सभी लाभ हैं।
बिशप

6
ओपी के मामले में यह एक निर्देशिका है, फाइल नहीं। rmdir ?/सभी खाली एकल-वर्ण निर्देशिकाओं को हटा देगा, और दूसरों के खाली न होने की शिकायत करेगा।
पीटर कॉर्डेस

2
@ बिशप: वाह, मुझे भी नहीं पता था कि selectअस्तित्व में, बहुत साफ!
मत्तेओ इटालिया

@PeterCordes: wops, मैंने ध्यान नहीं दिया कि हम निर्देशिकाओं के बारे में बात कर रहे थे; मैंने जोड़ा -r(और ./- मेरे उदाहरणों को भूलना हमेशा आसान होता है), दुर्भाग्य rmdirसे -iझंडे का समर्थन नहीं करता है । फिर भी, मुझे लगता है कि इस मामले में जाने का सबसे अच्छा तरीका बिशप और आपकी टिप्पणी का एक संयोजन होगा।
माटेओ इटालिया

1
@MatteoItalia selectकेवल कुछ गोले में मौजूद है, यही वजह है कि शायद आप इसमें भाग नहीं गए हैं - स्क्रिप्ट और समाधान जो पोर्टेबल होने के लिए हैं, इससे बचने के लिए, इसलिए हमें इसे "जंगली" देखने की संभावना कम है।
mtraceur

23

एक विकल्प यह है कि फ़ाइल नाम को किसी अन्य चीज़ के साथ देखना है ls। यदि आप जानते हैं कि यह एक क्रियात्मक Ctrl+ द्वारा निर्मित किया गया था C, तो आप नियंत्रण वर्णों की तालिका का उपयोग करके निर्मित ASCII वर्ण पा सकते हैं , या पायथन द्वारा प्रदान किए गए एक जैसे अधिक अनुकूल इंटरफ़ेस के साथ:

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

एक अन्य विकल्प lsउदाहरण के लिए , के आउटपुट के हेक्स डंप को देखना होगा hexdump

तब आप इस bash कमांड से फ़ाइल को हटा सकते हैं (उदाहरण के लिए):

rmdir "$(printf '\x03')"

(दोहरे उद्धरण चिह्नों की केवल तभी आवश्यकता होती है जब आप जिस चरित्र को प्रिंट करने का प्रयास कर रहे हैं वह आपके IFSचर में है, जैसे कि \x20या \x0A, लेकिन कमांड प्रतिस्थापन को उद्धृत करना एक अच्छी आदत है जब तक आप नहीं जानते कि आप शेल को क्षेत्र विभाजन करना चाहते हैं, आदि)


2
इसके अलावा cat -v(प्लस man ascii) पहले भाग के लिए मदद कर सकता है।
माटेओ इटालिया

13
... या आप os.rmdir('\x03')सीधे पायथन शेल से उपयोग करते हैं।
मूओइप

15

अक्सर इस तरह की स्थितियों में वाइल्डकार्ड पैटर्न के साथ आना आसान होता है जो संबंधित फाइल से मेल खाता है।

आपके मामले में, यह बस होगा ?(ठीक एक वर्ण के साथ सभी फ़ाइल नामों का मिलान)।

बस जाँच करें कि यह वास्तव में आप क्या चाहते हैं:

ls -ld ?

और फिर निर्देशिका निकालें:

rmdir ?

आप इसे टैब पूरा होने के साथ भी जोड़ सकते हैं । आपको लिखना आता है

rmdir ?

और प्रेस टैब, और bash में जैसे यह द्वारा प्रतिस्थापित किया जाएगा

rmdir ^C/

और फिर आप एंट्री मार सकते हैं और यह वही करता है जो आप चाहते हैं।


11

आप फ़ाइल को हटाने के लिए मिडनाइट कमांडर (mc) का उपयोग कर सकते हैं - बस अप / डाउन बटन के साथ चयन करें और F8 दबाएं।

मैंने कभी-कभी ऐसा किया जब एन्कोडिंग के कारण फ़ाइल नामों में अजीब अक्षर थे।


4
या किसी अन्य फ़ाइल प्रबंधक के बारे में।
स्टिग हेमर

@StigHemmer निश्चित रूप से, कुछ निश्चित फ़ाइलनाम प्रदर्शित करने के लिए दूसरों की तुलना में बेहतर करते हैं। संभवतः उत्तर यह समझा सकता है कि कुछ चुनिंदा अन्य की तुलना में MC एक इष्टतम विकल्प क्यों है। मुझे नहीं पता होगा, क्योंकि मैंने कभी इसका इस्तेमाल नहीं किया है।
कैन-नेड_फूड

7

अभी तक एक और तरीका: statनिर्देशिका नाम का एक बचा हुआ प्रतिनिधित्व प्राप्त करने के लिए उपयोग करें:

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

अब आप फ़ाइल नाम का प्रतिनिधित्व जानते हैं, इसलिए आप फ़ाइल को नाम से हटा सकते हैं printf:

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

या, यदि आप बैश का उपयोग कर रहे हैं, तो आप बच सकते हैं printf:

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

BTW यदि शेल बैश है, $'\x03'तो प्रिंटफ को कॉल करने की तुलना में सरल है। फ्रीबीएसडी श के लिए वही है जो कुछ स्वादिष्ट विशेषताओं के साथ पोसिक्स शेल पर विस्तारित है।
नेट

बैश के बारे में @Netch अच्छा बिंदु है $'...', लेकिन मैं सामान्य रूप से अष्टक से हेक्साडेसिमल में बेकार रूपांतरण से बचूंगा । उदाहरण के लिए यदि फ़ाइल का नाम '\111'( statआउटपुट में) है तो क्या होगा ? क्या आप अभी भी इसका उपयोग करके निकाल देंगे $'\x49'? बेहतर रूप में एक ही अनुक्रम का उपयोग stat, ओपी के मामले में: आपके द्वारा दिया गया rmdir $'\003'
रुस्लान

6

एक समाधान जो मेरे लिए काम करता है वह है:

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

उपलब्ध फ़ाइलों के माध्यम से साइकिल चलाने के लिए जब तक मुझे वह नहीं मिल जाता जिसे मैं हटाना चाहता हूं।

लेकिन काम करने के लिए आपको अपने शेल में आवश्यक सेटिंग्स होना आवश्यक है


^ सी वास्तव में टैब अनुक्रम में जल्दी है इसलिए आपके लिए +1 है।
जोशसन

5

सबसे आसान तरीका सब कुछ अस्थायी निर्देशिका में ले जाना है और फिर rm -r DIRNAME


7
क्या यह वास्तव में स्वीकृत उत्तर की तुलना में आपके लिए आसान लगता है?
चूजों

2
@chicks: यह वास्तव में इतना बुरा जवाब नहीं है। मैंने देखा है ^ V ^ C काम नहीं कर रहा है ताकि कोई फंस जाए।
जोशसन

यह प्रति से अधिक गलत नहीं है, लेकिन यह अधिक प्रत्यक्ष समाधान की तुलना में बहुत सारे अतिरिक्त काम की तरह लगता है। शायद मैं लिनक्स द्वारा खराब कर दिया गया हूं, लेकिन ^vमुझे उम्र के लिए लगातार काम किया है।
चूजों

6
@chicks ^Vको एक विशिष्ट ज्ञान की आवश्यकता होती है, जबकि फाइलों को इधर- उधर घुमाते हुए मूल निर्देशिका से हटाया जा सकता है।
कोंडायबस

5
Ctrl + V खतरनाक रूप से आपके सटीक कार्य वातावरण के आधार पर अस्पष्ट है ... कुछ टर्मिनल एमुलेटर इसे पेस्ट के रूप में व्याख्या कर सकते हैं। यदि आपके पेस्ट बफर में ऐसी चीज़ का नाम है जिसे आप हटाना नहीं चाहते हैं - और एक नई पंक्ति, तो आप एक समस्या को देख सकते हैं।
रैकैंडबोनमैन

1

यदि यह केवल खाली निर्देशिका है (या आप अन्य खाली निर्देशिकाओं को हटाने के बारे में परवाह नहीं करते हैं), उपयोग करेंrmdir */ । आपको rmdirगैर-रिक्त निर्देशिका को निकालने में सक्षम नहीं होने के बारे में त्रुटि संदेश मिलेंगे , लेकिन यह ठीक है। GNU rmdirसमर्थन करता है --ignore-fail-on-non-empty, या आप कर सकते हैं 2>/dev/null

अनुगामी /ग्लोब केवल निर्देशिका नामों से मेल खाता है।

आप समय के आगे की जाँच कर सकते हैं कि वर्तमान में कौन सी खाली निर्देशिकाएं मौजूद हैं
find -maxdepth 1 -type d -empty -ls। (और आप बदल सकते हैं -lsकरने के लिए -deleteअगर आप चाहते हैं)।

आप rmdir [^A-Za-z0-9._]/निर्देशिकाओं का मिलान करने के लिए एक अधिक विशिष्ट ग्लोब अभिव्यक्ति का उपयोग कर सकते हैं जो एक गैर-अल्फ़ान्यूमेरिक या अंडरस्कोर फ़ाइल नाम से शुरू होता है। मैंने भी शामिल किया ., लेकिन ग्लोब एक्सप्रेशन .आम तौर पर वैसे भी मेल नहीं खाते ।


जैसा कि अन्य ने बताया है, आप इसे ग्लोब के साथ एकल-वर्ण नामों तक सीमित कर सकते हैं ?: rmdir ?/

rmdir-iजिस तरह से rmकरता है एक विकल्प नहीं है, संभवतः क्योंकि खाली निर्देशिका आमतौर पर मूल्यवान नहीं हैं और बस फिर से बनाया जा सकता है।


1
आप जानना चाहते हैं कि आप किन निर्देशिकाओं को फिर से बनाना चाहते हैं, और rmdirयदि आप -vइसका विकल्प पास करते हैं (कम से कम GNU में) तो आपको बता सकते हैं ।
रुस्लान

@Ruslan: यदि आपके पास अन्य बासी निर्देशिकाएं नहीं थीं, जिनकी आपको अब परवाह नहीं थी, और उन्हें हटाना बोनस होगा। आप खाली निर्देशिका के लिए देख सकते हैंfind -maxdepth 1 -type d -empty -ls
पीटर कॉर्ड्स

-1

कुछ भी जोखिम भरा करने से पहले, पहले यह प्रयास करें:

rmdir -- ^C

सामान्य तौर पर - एक सीमांकक बता रहा है कि कमांड संख्या -o ptions का पालन नहीं करेगा, लेकिन यह अजीब पात्रों के लिए कुछ और के रूप में व्याख्या नहीं करने की अनुमति देगा।

एक और उपयोग उदाहरण है whois -r -- "-r OBJECT-RIPE"

-r परिपक्व के लिए एक शॉर्टकट है, लेकिन पके में जो भी एक पैरामीटर है)

अगर यह पहली कोशिश में काम नहीं करता है, तो शायद कोशिश करें rmdir -- "^C"

लेकिन मेरे csh खोल में मुझे इसकी कोई आवश्यकता नहीं है, बस rmdir ^Cपहले से ही मेरे लिए काम करता है।


1
Csh टाइपिंग में rmdir उसके बाद <ctrl> C काम करता है? वास्तव में?! मुझे उम्मीद है कि यह अलग तरह से व्यवहार करेगा, अर्थात् rmdirकमांड को निरस्त करके आपको कमांडलाइन पर लौटाएगा।
Mausy5043

यह वास्तव में होगा। कमांड लाइन पर ^ C वर्ण दर्ज करने के तरीके के बारे में स्वीकृत उत्तर देखें।
अले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.