मैं उस फ़ाइल को कैसे हटाऊं जिसका नाम "-" (हाइफ़न उर्फ ​​डैश या माइनस) से शुरू होता है?


348

आप ऐसी फ़ाइल को कैसे निकालते हैं जिसका फ़ाइल नाम डैश (हाइफ़न या माइनस) से शुरू होता है -? मैं एक दूरस्थ OSX सर्वर में ssh'd हूँ और मेरी निर्देशिका में यह फ़ाइल है:

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

कैसे मैं दुनिया में --helpएक सीएलआई से हटा सकते हैं ? यह समस्या कुछ ऐसी है जो मैं इस अवसर पर विभिन्न रूपों में सामने आती हूं, इन फ़ाइलों को बनाना आसान है, लेकिन छुटकारा पाने के लिए कठिन है।

मैंने बैकस्लैश का उपयोग करने की कोशिश की है

rm \-\-help

मैंने उद्धरणों की कोशिश की है

rm "--help"

मैं एक विकल्प के रूप में व्याख्या किए जाने के लिए माइनस (डैश या हाइफ़न) चरित्र को कैसे रोकूं?


1
बहुत अच्छा होगा अगर इस सवाल का नाम बदल दिया गया "कैसे एक फ़ाइल को हटाने के लिए जिसका नाम इसके साथ शुरू होता है -"।
सैंडी

@ कैंडी सहमत; मैं सामान्य रूप से एक सवाल के अर्थ बदल रहा है नापसंद करते हैं, लेकिन इस मामले में स्वीकार किए जाते हैं जवाब इस समस्या के लिए विशिष्ट है
माइकल Mrozek

33
मुझे यह थोड़ा विडंबनापूर्ण लगता है कि rm --helpवास्तव में यह बताता है कि फाइलनेम को कैसे हटाना है -। फिर भी अच्छा सवाल है।
lesmana

1
@ jw013 कभी-कभी अनुभवी उपयोगकर्ताओं को समझने में मदद मिलती है, लेकिन नए लोगों को भारी और भ्रमित करना।
इकोनॉस्टल

1
मैं बिजीबॉक्स से आरएम का उपयोग कर एक सिस्टम पर इस में भाग गया। मदद सहित सब कुछ न्यूनतम है, इसलिए rm --help ने कोई सुराग नहीं दिया।
dslake

जवाबों:


497

Rm stop parsing कमांड लाइन विकल्प बनाने के लिए "-" का प्रयोग करें, जैसे:

rm -- --help

1
मुझे पता था कि यह कुछ बहुत ही सरल था ...
ब्रायन रेहेबिन

2
क्या rmकमांड के सभी संस्करण --तर्क का समर्थन करते हैं?
कीथ थॉम्पसन

3
@KeithThompson - अधिकांश GNU टूल की एक विशेषता है, इसलिए यह अधिकांश गैर-GNU ("नॉन-लिनक्स") Unix'es (जैसे BSD वेरिएंट या कुछ एम्बेडेड सिस्टम) पर काम नहीं करेगा
dtech

1
धन्यवाद! जिससे मेरा दिन बच गया। और निश्चित रूप से यह बीएसडी (OSX) और अन्य कमांड के साथ काम करता है!
रसखडाफि

8
@dtech, getopt () और --GNU (SysIII, 1980) की भविष्यवाणी करें और मानक / POSIX हैं। कुछ अपवादों (जैसे echo) को छोड़कर मानक उपयोगिताओं को समझते हैं --। अन्य कमांड के लिए YMMV यदि वे विकल्प को पार्स करने के लिए getopt () API का उपयोग नहीं करते हैं।
स्टीफन चेज़लस

213

या आप कर सकते हैं

rm ./--help

7
ऐसा नहीं है कि यह मायने रखता है लेकिन यह सबसे "उचित" लगता है।
जेम्स एम।

2
यह वह है जो मुझे याद है। "Rm - --help" का उपयोग करना कुछ ऐसा है जो मुझे हमेशा देखना होता है।
user603

25
यह विधि हमेशा उन कमांड के लिए भी काम करती है जो --विशेष रूप से व्यवहार नहीं करते हैं ।
jw013

और यह भी तरह विशेष रूप से नामित तर्कों के अन्य प्रकारों के लिए कुछ आदेश द्वारा विशेष व्यवहार (विकल्प के बगल में) से बचने के लिए काम करता है -पाठ उपयोगिताओं के या cd, foo=barका awk...
स्टीफन Chazelas

1
यह तब काम करता है जब एक फ़ाइल एकल डैश से शुरू होती है, जहां rm -- <filename>नहीं थी।
स्टॉकब

37

findइसे करने के लिए उपयोग करें :

find . -name '--help' -delete

और यह एक अच्छा तरीका है क्योंकि अगर आपके पास अधिक है तो कुछ फाइलें जैसे कि आप डिलीट कर सकते हैं आप केवल -deleteपहले विकल्प के बिना ढूंढकर फ़ाइलों की एक पूर्वावलोकन सूची प्राप्त कर सकते हैं , और फिर यदि फ़ाइलों की सूची अच्छी लगती है तो बस चलाएं इसके साथ फिर से -delete

वास्तव में, आप (विशेष रूप से पहले पूर्वावलोकन के साथ) के rmपक्ष में परहेज findकरना एक अच्छी आदत है जो आपको गलतियों से बचने में मदद rm *करेगी, जो अनिवार्य रूप से आपको किसी दिन काट लेगी।

ध्यान दें, हालांकि, यह खोज आपके सभी उपनिर्देशिकाओं के माध्यम से पुनरावृत्ति करेगी, इसलिए आप इसे इस तरह से एक उपनिर्देशिका गहराई बाधा के साथ चलाना चाह सकते हैं:

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

जो वर्तमान निर्देशिका को खोजने को सीमित करता है।


विशेष रूप से, आपको findदेखने के लिए फ़ाइलों / डायरियों की एक सूची देने की आवश्यकता है । तो find . -name...-deleteऔर -maxdepthमानक विकल्प भी नहीं हैं।
स्टीफन चेज़लस

21

वीगर निल्सन और एडफू के उत्तर बहुत अच्छे हैं और इस तरह की समस्या का उचित समाधान है।

मैं इस सवाल पर एक सामान्य प्रतिक्रिया जोड़ना चाहता हूं जो आपको किसी भी फ़ाइल को मुश्किल फ़ाइल नाम से हटाने की अनुमति देता है । पहले इसका इनोड नंबर ls -iकिसी न किसी रूप का उपयोग करके प्राप्त किया जाता है statऔर फिर फाइल को वर्तमान निर्देशिका में इनकोड संख्या द्वारा फाइलों की खोज करके और rmमिलान इनोड संख्या के साथ फाइल पर कमांड को निष्पादित करके हटा दिया जाता है।

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

चूंकि प्रत्येक फाइल सिस्टम में इनोड संख्या अद्वितीय होती है इसलिए आप इसका उपयोग करके किसी भी फाइल को हटा सकते हैं; यूनिकोड या भागने के पात्रों का उपयोग करना। यह कभी-कभी टाइप करने के लिए बहुत कष्टप्रद होता है इसलिए मैं लाइन जोड़ने की सलाह दूंगा

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

.inputrcअगर आप bash का उपयोग कर रहे हैं तो आपकी फ़ाइल में । यह आपको संभावित पूर्णताओं की सूची के माध्यम से साइकिल चलाने की अनुमति देता है ( आगे की जानकारी के लिए )।


5
इस तरह से दो समस्याएँ हैं: 1) -exec rm का उपयोग न करें जब आप -delete का उपयोग कर सकते हैं; : 2) inode प्राप्त करने और का उपयोग कर कि बेकार में overcomplicated है जब आप केवल उपयोग कर सकते हैंfind -name '--help' -delete
aculich

मुझे नहीं लगता कि यह काम करेगा। यह वर्तमान निर्देशिका और उसके सभी उपनिर्देशिकाओं में सभी फाइलों का पता लगाता है, और आखिरकार यह अभी भी आह्वान करता है rm --help, जो अभी भी फ़ाइल को नहीं हटाएगा। बस का उपयोग करें rm ./--help(या rm -i *
कीथ थॉम्पसन

1
@KeithThompson findसभी फ़ाइलों के लिए कमांड लाइन तर्क पथ को उपसर्ग करता है, इसलिए यह चलेगा rm ./--helpऔर rm ./sub/dirs/--help। दूसरे को ठीक करने के लिए, एक जोड़ना होगा -maxdepth 1, लेकिन यह सब अनिवार्य रूप से @ edfuh के समाधान को अधिक गोल चक्कर, जटिल तरीके से लागू कर रहा है, और वैसे भी -deleteअधिक सुरक्षित है -exec rm
jw013

1
इस आदेश के साथ एक और मुद्दा यह है कि वहाँ के बीच एक रिक्ति होना चाहिए है {}और \;, अन्यथा यह काम नहीं करेगा।
यूजीन एस

इनोड्स अद्वितीय हो सकते हैं लेकिन एक ही इनोड के साथ कई निर्देशिका प्रविष्टियाँ हो सकती हैं। जिन्हें हार्डलिंक कहा जाता है। और वे केवल फ़ाइल सिस्टम के अनुसार अद्वितीय हैं, इसलिए आपको उपयोग करने की आवश्यकता होगी -xdev। इससे आपको उसे चलाने में मदद नहीं मिलेगी ls -i --help
स्टीफन चेजलस


8

लिनक्स वॉकथ्र्स फ़ाइल को डैश और स्पेस के साथ बनाते हुए, फिर उसे हटाते हुए।

सावधान रहे! गलती से rm -rf /या समान कैस्केड डिलीट कमांड न चलाएं ।

आपकी फ़ाइल आप हटाने की कोशिश कर रहे हैं तारक या स्लैश शामिल हैं, तो गलती से एक पंप नहीं है .या /*या *या कुछ अन्य वाइल्डकार्ड जो अपने ऑपरेटिंग सिस्टम को नष्ट झरना सकता है।

"--Yo yo" नामक एक फ़ाइल बनाएँ

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

सबसे पहले, इसे खोजें:

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

सुनिश्चित करें कि खोज आदेश केवल उसी फ़ाइल को खोजता है जिसे आप हटाना चाहते हैं:

फिर उन्हें हटाने के लिए -delete विकल्प खोजें:

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

आअनंद यह चला गया।


2

मिडनाइट कमांडर ( mc) सबसे आसान है, बस इसे इंगित करें और F8 मारा;)


3
ओपी कमांड लाइन (सीएलआई) समाधान चाहता है।
फ्रांसेस्को तुर्को

1
आधी रात के कमांडर एक सीएलआई समाधान है। इसे स्थापित करने के लिए बस अपने पैकेज मैन्जर का उपयोग करें। (यह ssh पर भी काम करता है ...) en.wikipedia.org/wiki/Midnight_Commander
daviewales

6
कैसे apt-get install mc || yum install mc; mc विभिन्न तीर कुंजी और F8 की तुलना में आसान है rm ./--help?
जोश

3
@daviewales: मिडनाइट कमांडर को कमांड लाइन से शुरू किया जाता है, और यह टर्मिनल में चलता है, लेकिन मिडनाइट कमांडर के भीतर सभी कीबोर्ड एक्शन सीएलआई (कमांड लाइन इंटरफेस) से नहीं होते हैं - वे मिडनाइट कमांडर के इंटरफेस से होते हैं। - आमतौर पर, कमांड लाइन उपयोगिताओं को एक स्क्रिप्ट के भीतर चलाया जा सकता है (एक अपवाद कमांड लाइन इतिहास है)
Peter.O

1

यहाँ एक समाधान है जो मैंने इस धागे को खोजने से पहले उपयोग किया था। 'संपादन' निर्देशिका का
उपयोग vimकरें:

vim .

तब (vim में) अपनी फ़ाइल चुनें, डेल डिलीट करें और डिलीट की पुष्टि करें।
जब आप कर रहे हैं के साथ छोड़ दिया विम:q


0

क्या आपने निर्देशिका नाम को उपसर्ग के रूप में जोड़ने का प्रयास किया है:

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

सामान्य रूप से फ़ाइल के उपसर्ग के रूप में निर्देशिका का उपयोग करने से पैरेंट फ़ंक्शन द्वारा कमांड विकल्प के रूप में "माइनस" चरित्र की गलत व्याख्या से बचने में मदद मिलती है।


1
मेरा मानना ​​है कि यह पहले से ही उत्तर में कवर किया गया था ।
Kusalananda

-3

यदि आप फ़ाइल का नाम बदलना चाहते हैं -.bar, (mv काम नहीं करेगा), इसे आज़माएँ:

cat >foo.bar <-.bar

आदेश का उपयोग करने से पहले:

rm -- -.bar

आपको foo.bar में मूल फ़ाइल की सामग्री की जांच करने में सक्षम होना चाहिए


4
फ़ाइल का एक प्रतिलिपि बनाना नाम बदलने के लिए एक बहुत ही कुशल समाधान नहीं है।
jw013

1
आप vidir का उपयोग कर सकते हैं; लेकिन वह शायद सिर्फ (या और भी अधिक) अक्षम है - और बहुत अधिक खतरनाक है।
स्टीफन मेंसियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.