2009-04-01 7 views
66

मैं इससेडबल हाइफ़न से शुरू होने वाली फ़ाइलों को कैसे निकालें?

-- 

उदा शुरू मेरी यूनिक्स मशीन पर कुछ फ़ाइलें --testings.html

अगर मैं मैं निम्नलिखित त्रुटि मिलती है इसे हटाने के लिए प्रयास करें:

cb0$ rm --testings.html 
rm: illegal option -- - 
usage: rm [-f | -i] [-dPRrvW] file ... 
     unlink file 

मैं

rm "--testings.html" || rm '--testings.html' 

कोशिश की, लेकिन कुछ भी नहीं काम करता है।

मैं टर्मिनल पर ऐसी फ़ाइलों को कैसे हटा सकता हूं?

+0

[serverfault] पर समान (https://serverfault.com/questions/47003/deleting-a-unix-directory-with-a-hyphen-in-the-name) और [यूनिक्स] (https: // unix.stackexchange.com/questions/1519/how-do-i-delete-a-file-whose-name-begins-with-hyphen-aka-dash-or-minus)। – Dorian

+1

@ डोरियन ठीक है, लेकिन मैं पहले था :) – cb0

उत्तर

140
rm -- --testings.html 

-- विकल्प rm बताता विकल्प के रूप में नहीं, फ़ाइल नाम के रूप में आगे की सभी तर्कों के इलाज के लिए, भले ही वे - साथ शुरू करते हैं।

यह आरएम कमांड के लिए विशेष नहीं है। गेटोपट फ़ंक्शन इसे लागू करता है, और कई (सभी?) यूनिक्स-स्टाइल कमांड इसे उसी तरह से मानते हैं: -- विकल्प प्रसंस्करण को समाप्त करता है, और इसके बाद कुछ भी नियमित तर्क होता है।

http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt

+0

बिल्कुल मुझे क्या चाहिए, धन्यवाद – cb0

+4

यह यूनिक्स के सभी संस्करणों में मानक नहीं है, हालांकि यह अधिकतर काम करता है। एक संस्करण के लिए वैटिन का जवाब देखें जो सभी संस्करणों के साथ काम करता है। –

17

या तो rm -- --testings.html या rm ./--testings.html

1
rm ./--testings.html 

या

rm -- --testings.html 
55
rm -- --somefile 

है कि काम करता है, यह एक समाधान है कि इसके विकल्प पार्स करने के लिए rm getopts का उपयोग कर पर निर्भर करता है है। वहां ऐसे अनुप्रयोग हैं जो अपना स्वयं का पार्सिंग करते हैं और उस पर भी प्यूक करेंगे (क्योंकि वे "--" विकल्प का अंत "तर्क लागू नहीं कर सकते हैं)। क्योंकि इस तरह से अपने तर्क कभी नहीं एक - के साथ शुरू,

rm ./--somefile 

यह हमेशा काम करेगा:

इस कारण से

, समाधान आप अपने खोपड़ी के माध्यम से ड्राइव करना चाहिए इस से एक है।

इसके अलावा, यदि आप वास्तव में सभ्य शैल स्क्रिप्ट बनाने की कोशिश कर रहे हैं; आपको तकनीकी रूप से ./ को अपने सभी फ़ाइल नाम पैरामीटर विस्तारों के सामने डालना चाहिए ताकि आपकी स्क्रिप्ट को फंकी फ़ाइल नाम इनपुट (या उन चीजों को करने के लिए दुर्व्यवहार/शोषण से रोका जा सके, जिन्हें वे नहीं करना चाहते हैं: उदाहरण के लिए, rm फ़ाइलों को हटाएं लेकिन निर्देशिकाओं पर छोड़ दें; जबकि rm -rf * सबकुछ हटा देगा। "-rf" का एक फ़ाइल नाम किसी स्क्रिप्ट या किसी को touch ~victim/-rf 'आईएनजी इस तरह से वास्तव में खराब व्यवहार के साथ अपने व्यवहार को बदलने के लिए उपयोग किया जा सकता है)।

+2

+1 क्योंकि आप सही हैं, लेकिन स्क्रिप्ट्स बुलेटप्रूफ बनाना एक अजीब फ़ाइल नाम से निपटने के अलावा एक अन्य मुद्दा है। अगर सवाल था "मैं हाइफ़न या रिक्त स्थान से शुरू होने वाली फ़ाइलों को कैसे हटा सकता हूं,; <,, $, और अन्य दुर्भावनापूर्ण जंक" तो इसे पूर्ण उत्तर की आवश्यकता होगी :-) –

4

फिर भी ऐसा करने का एक और तरीका ढूंढना है ...-name "- *" -delete

touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 
3

फ़ाइल नाम में असंभव पात्रों के साथ फ़ाइलों को हटाने के लिए एक अधिक सामान्य दृष्टिकोण के लिए, एक ही विकल्प फ़ाइल के inode उपयोग करने के लिए है।

इसे ls -i के माध्यम से प्राप्त किया जा सकता है।

उदा।

$ ls -lai | grep -i test 
452998712 -rw-r--r-- 1 dim dim  6 2009-05-22 21:50 --testings.html 

और यह मिटाने के लिए, खोज की मदद से:

$ find ./ -inum 452998712 -exec rm \{\} \; 

इस प्रक्रिया को फायदेमंद हो सकता है जब फ़ाइल नाम विशेषताओं के साथ फ़ाइलें के बहुत सारे के साथ काम कर के रूप में यह आसानी से पटकथा जा सकता है।

+1

यह केवल इसलिए काम करता है क्योंकि यह 'rm' को आमंत्रित करता है तर्क './-- testings.html'। बस 'rm ./-- testings.html' टाइप करना आसान है - जिसे पूरे निर्देशिका पेड़ को पार करने की आवश्यकता नहीं है। (आप '-maxdepth 1' का उपयोग कर बाद वाले से बच सकते हैं।) –