सवाल फ्रीबीएसडी: निर्देशिका ^ सी (वास्तव में!) कहा जाता है - कैसे निकालें?


मैंने एक टाइपो बनाया:

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

अब मेरे पास एक फाइल है जिसे ^ सी (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/

जाहिर है मैं एक ^ सी टाइप नहीं कर सकता: - / मैं इस फाइल को कैसे हटा सकता हूं?


128
2018-01-21 15:55


मूल


यह बहुत बुरा है डीएसडब्ल्यू इसे पॉज़िक्स में नहीं बनाया। - Mark Plotnick
@ मार्क प्लॉटनिक: बहुत बुरा मूल  dsw इसे पॉज़िक्स में नहीं बनाया। - Matteo Italia
मुझे नहीं लगता कि आपने इसे ctrl + c नाम दिया है, आपने इसे एएससीआई चरित्र के नाम पर रखा है जिसे उस कीबोर्ड शॉर्टकट में मैप किया गया है, यानी ईटीएक्स (एएससीआई 3) शायद। आपके कंसोल फ़ॉन्ट में उस चरित्र के लिए कोई ग्लिफ नहीं है, इसलिए यह एक सामान्य प्रतिस्थापन ग्लाइफ "?" का उपयोग करता है। - jiggunjer
emacs -nw -f dired एक निर्देशिका नेविगेटर देता है। <kbd> डी </ kbd> पुष्टिकरण के बाद कर्सर के नीचे फ़ाइल हटा देता है। - Thorbjørn Ravn Andersen
@MatteoItalia यह फ़ाइल नामों और अन्य में बहुत खराब नियंत्रण वर्ण है मूर्खतापूर्ण  विचारों ने इसे POSIX में बनाया ... - pipe


जवाब:


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

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


189
2018-01-21 16:23



यह संभवतः ओपी ने अपना टाइपो पहले स्थान पर कैसे बनाया था। वी और सी कुंजीपटल पर एक दूसरे के बगल में हैं। - Stig Hemmer
या वे बीएसडी टर्मिनल पर विंडोज क्लिपबोर्ड का उपयोग करने की कोशिश कर रहे थे। - Joel Coel
@ जोएल कोएल आदत कभी नहीं मरती! - Mafii
दिलचस्प बात यह है ^V^C कर देता है नहीं जेएसएच लाइन संपादक में काम करें; उद्धृत-डालने विजेट (के लिए पेज खोजें ^V) स्पष्ट रूप से इंटरप्ट वर्णों को सम्मिलित नहीं करता है। जैकोब का जवाब (printf का उपयोग करके) एक शेल तर्क में नियंत्रण चरित्र की आपूर्ति का एक और पोर्टेबल तरीका हो सकता है। - Miles
@StigHemmer: क्या हो सकता है कि आप कमांड के बीच में Ctrl-C दबाएं, फिर इसके बारे में भूल जाएं और बाद में कमांड पेस्ट करें। - Mehrdad


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

$ 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, तर्क आदेश मायने रखता है!


89
2018-01-22 03:42



क्यों नहीं रखा -delete से पहले -inum? क्या यह केवल सावधानी बरतता है यदि आप समय-समय पर प्रवेश करते हैं या तर्कों का क्रम वास्तव में परिणाम को प्रभावित करता है? - detuur
@detuur: आदेश परिणाम को प्रभावित करता है। संपादन देखें। - bishop
मत डालो -delete कमांड, अवधि में, जब तक आप बिना आदेश चलाते हैं -deleteयह जांचने के लिए कि आप जो चाहते हैं उसे ढूंढ रहे हैं। - Kaz
@Kaz कमांड के केंद्र में -डिलेट जोड़ने के साथ ज्यादा मदद नहीं करेगा - RiaD
@ काज़ का उपयोग कर -print के बजाय -delete एक बहुत अच्छा परीक्षण करता है। - Mark Ransom


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

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


31
2018-01-21 20:13



select f in ?; do rm -i "$f"; break; done के सभी लाभ हैं -i, जवाब देने की पीड़ा के बिना no अवांछित अग्रणी या गलती से हाँ को जवाब देने के लिए जो आप रखना चाहते हैं। - bishop
ओपी के मामले में यह एक निर्देशिका है, फाइल नहीं। rmdir ?/ सभी खाली सिंगल-कैरेक्टर निर्देशिकाओं को हटा देगा, और दूसरों के बारे में शिकायत न करें। - Peter Cordes
@ बिशप: वाह, मुझे यह भी पता नहीं था select अस्तित्व में, बहुत साफ! - Matteo Italia
@ पीटरकॉर्डस: wops, मैंने ध्यान नहीं दिया कि हम निर्देशिकाओं के बारे में बात कर रहे थे; मैंने कहा -r (तथा ./ - भूलना हमेशा आसान है) दुर्भाग्य से, मेरे उदाहरणों के लिए rmdir का समर्थन नहीं करता है -i झंडा। फिर भी, मुझे लगता है कि इस मामले में जाने का सबसे अच्छा तरीका बिशप और आपकी टिप्पणी का संयोजन होगा। - Matteo Italia
@MatteoItalia select केवल कुछ गोले में मौजूद है, शायद यही कारण है कि आपने इसमें भाग नहीं लिया है - स्क्रिप्ट और समाधान जो पोर्टेबल होने के लिए हैं, इससे बचें, इसलिए हमें इसे "जंगली में" देखने की संभावना कम है। - mtraceur


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

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

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

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

rmdir "$(printf '\x03')"

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


23
2018-01-21 18:51



भी cat -v (प्लस man ascii) पहले भाग में मदद कर सकते हैं। - Matteo Italia
... या आप उपयोग करते हैं os.rmdir('\x03') सीधे पाइथन खोल से। - moooeeeep


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

आपके मामले में, यह बस होगा ? (सटीक एक चरित्र के साथ सभी फ़ाइल नामों से मेल खाते हैं)।

बस जांचें कि यह वास्तव में आप जो चाहते हैं उससे मेल खाता है:

ls -ld ?

और फिर निर्देशिका को हटा दें:

rmdir ?

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

rmdir ?

और टैब दबाएं, और उदा। बाश में इसे बदल दिया जाएगा

rmdir ^C/

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


15
2018-01-21 21:02





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

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


11
2018-01-21 20:29



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


फिर भी एक और तरीका: उपयोग करें stat निर्देशिका नाम से बच निकलने के लिए:

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

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

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

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

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

7
2018-01-22 10:25



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


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

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

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

लेकिन आपको करने की ज़रूरत है आवश्यक सेटिंग्स काम करने के लिए अपने खोल में।


6
2018-01-22 08:31



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


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


5
2018-01-21 16:31



क्या स्वीकार्य उत्तर से यह वास्तव में आपके लिए आसान लगता है? - chicks
@chicks: यह वास्तव में इतना बुरा जवाब नहीं है। मैंने देखा है ^ वी ^ सी काम नहीं करता है इसलिए कोई फंस सकता है। - joshudson
यह गलत नहीं है, लेकिन यह अधिक प्रत्यक्ष समाधान की तुलना में बहुत अधिक काम की तरह लगता है। शायद मैं लिनक्स द्वारा खराब हो गया हूं, लेकिन ^v उम्र के लिए लगातार काम किया है। - chicks
@chicks ^V फ़ाइलों को चारों ओर ले जाने और मूल निर्देशिका को हटाने के दौरान मूल ज्ञान से प्राप्त किया जा सकता है। - Kondybas
Ctrl + V आपके सटीक कामकाजी माहौल के आधार पर खतरनाक रूप से अस्पष्ट है ... कुछ टर्मिनल अनुकरणकर्ता इसे पेस्ट के रूप में समझ सकते हैं। यदि आपके पेस्ट बफर में उस चीज़ का नाम होता है जिसे आप हटाना नहीं चाहते हैं - और एक नई लाइन, तो आप किसी समस्या को देख सकते हैं। - rackandboneman


यदि यह एकमात्र खाली निर्देशिका है (या आप अन्य खाली निर्देशिकाओं को हटाने की परवाह नहीं करते हैं) उपयोग rmdir */। आपको त्रुटि संदेश मिलेगा rmdir गैर-खाली निर्देशिकाओं को हटाने में सक्षम नहीं होने के बारे में, लेकिन यह ठीक है। जीएनयू 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
2018-01-22 05:39



आप जानना चाहते हैं कि आप कौन सी निर्देशिका को फिर से बनाना चाहते हैं, और rmdir अगर आप पास करते हैं तो आपको बता सकते हैं -v इसके लिए विकल्प (कम से कम जीएनयू में)। - Ruslan
@ रुस्लान: यदि आपके पास अन्य पुरानी निर्देशिकाएं नहीं हैं, तो अब आप परवाह नहीं है, और उन्हें हटाने का बोनस होगा। आप खाली निर्देशिकाओं के साथ देख सकते हैं find -maxdepth 1 -type d -empty -ls - Peter Cordes