मैं लिनक्स में एक फाइल कैसे निकालूं जिसका नाम ऐसा लगता है जैसे यह केवल एक हाइफन है, जैसे कि "-"


33

मैंने कोशिश की

rm -- -
rm "-"
rm "\-"
rm \-

गोली मार दी

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `rm $junk`;'
-
rm: cannot remove `-': No such file or directory

...तथा...

~$ perl -e '$junk = glob("-"); chomp $junk; print "$junk\n"; `mv $junk newfile.garbage`;'
-
mv: cannot stat `-': No such file or directory

किसी भी सहायता की बहुत सराहना की जाएगी, बुद्धिमान लोग।


जिज्ञासा से बाहर, वहाँ कैसे पहुंचा?
पेटी बी

2
यह एक खराब तरीके से बनाई गई भूल का नतीजा था: "wget ​​-q -O-someserver.org/s/ip "

53
उस समय की याद दिलाता है जब एक सहकर्मी ने * नाम की एक फ़ाइल बनाई थी। यह कहानी अच्छी तरह से समाप्त नहीं हुई।
डेविड हेफर्नन

आप किस rmसंस्करण का उपयोग कर रहे हैं ( rm --version)? rm -जीएनयू कोरुटिल्स 8.5 के साथ ठीक काम करता है।
लेकेनस्टाइन

2
एक और संस्करण:rm ./-
एक CVn

जवाबों:


60

यह यूनिक्स के लिए यूज़नेट एफएक्यू में पोस्ट किया जाता था - मुझे लगता है कि यह जीएनयू कोर यूटिलिटी एफएक्यू में है । कम से कम पांच अलग-अलग तरीके थे, लेकिन यह अच्छी तरह से काम करता है:

$ rm ./-

यदि फ़ाइल नाम में अयोग्य अक्षर हैं, तो उपयोग करें:

$ rm -i *

-iझंडा प्रत्येक फ़ाइल के लिए पुष्टि के लिए पूछता है कि यह या नहीं हटाया जाना चाहिए।


1
या rm -i - ' - ' यदि आप डैश युक्त फाइलें ढूंढ रहे हैं और शायद कुछ रिक्त स्थान या जो भी हो।
हंस-पीटर स्टॉर

1
rm -i * ने भी मेरे लिए काम किया। धन्यवाद wallyk!
jgrundstad

39

एक ऐसी फ़ाइल को हटाना जिसका नाम -एफएक्यू है, लेकिन ऐसा लगता है कि आपको एक अलग समस्या है।

प्रश्न में वर्णित समाधानों में से:

rm -- -

वह काम करना चाहिए।

rm "-"

वह इससे अलग नहीं है rm -। उद्धरण शेल द्वारा छीन लिए गए हैं, और rmकमांड केवल एकल हाइफन को एक तर्क के रूप में देखता है। शेल मेटाचैकर से बचने के लिए उद्धरण चिह्न उपयोगी हैं; हाइफ़न के लिए विशेष है rm, शेल के लिए नहीं।

rm "\-"

उद्धरण चिह्न बैकस्लैश से बच जाते हैं, इसलिए यह एक फ़ाइल को हटाने का प्रयास करता है, जिसके नाम में दो वर्ण, एक बैकस्लैश और एक हाइफ़न शामिल हैं।

rm \-

यह बिलकुल वैसा ही है rm "-", जैसा है rm -

जैसा कि होता है, कम से कम जीएनयू कोरुटिल्स संस्करण के साथ rm, rm -वास्तव में एक फ़ाइल को निकालता है (या हटाने का प्रयास करता है) जिसका नाम सिर्फ एक हाइफ़न होता है। यदि आपकी फ़ाइल में यह नाम है, तो यह अब तक चला जाएगा। मैं यह निष्कर्ष निकालता हूं कि आपकी फ़ाइल का एक नाम है जो केवल एक हाइफ़न की तरह दिखता है

ls | cat -A

यह वास्तव में क्या कहा जाता है की एक विचार देना चाहिए।

यहाँ एक पर्ल स्क्रिप्ट है जिसे मैंने अभी-अभी एक साथ फेंक दिया है जो आपको वर्तमान निर्देशिका में प्रत्येक फ़ाइल के लिए संकेत देगा और पूछेगा कि क्या इसे निकालना है। वारंटी के बिना की पेशकश की, लेकिन मैं इसे संक्षेप में परीक्षण किया है।

#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

opendir my $DIR, '.' or die ".: $!\n";
my @files = sort grep { -f $_ } readdir $DIR;
closedir $DIR;

foreach my $file (@files) {
    print "Remove $file? ";
    my $answer = scalar <>;
    if ($answer =~ /^[Yy]/) {
        unlink $file or warn "$file: $!\n";
    }
    elsif ($answer =~ /^[Qq]/) {
        exit 0;
    }
}

संपादित करें : एक कम विस्तृत समाधान: यदि फ़ाइल का नाम सिर्फ एक वर्ण है, तो rm ?उसे हटा देना चाहिए (साथ में ऐसी अन्य फाइलें)।


13
M-bM-^@M-^Sयूनिकोड "एन डैश" चरित्र के 0x2013 के 3-बाइट UTF-8 का एक प्रस्तुतीकरण है। मुझे आश्चर्य है कि अगर आपने गलती से इसे एक वेब पेज से कॉपी-पेस्ट किया है।
कीथ थॉम्पसन

7
काम rm -i *नहीं किया? ऐसा लगता है कि यह पर्ल स्क्रिप्ट की तरह ही काम करेगा।
user606723

2
मैं यह अनुमान लगा रहा हूं कि यह उस वेब पेज से उत्पन्न हुआ था जिस पर मैंने विग की ओर इशारा किया था। किसी भी मामले में, पूरी तरह से समाधान के लिए फिर से धन्यवाद! ध्यान रखें।
jgrundstad

5
perl -e 'अनलिंक grep {प्रिंट "$ _ हटाएं?"; <STDIN> = ~ / y / i} ग्लोब "*"
रैंडल श्वार्ट्ज

6
@RandalSchwartz: प्रभावशाली रूप से (और मेरे दिमाग को थोड़ा चोट पहुंचाता है) - लेकिन मैं इसके /^y/iबजाय चाहता हूँ /y/i। आखिरकार, एक रूसी उपयोगकर्ता "Nyet" लिख सकता है।
कीथ थॉम्पसन

19

यदि आप कुछ सुरक्षित चाहते हैं ...

Ls और ढूँढें के संयोजन का उपयोग करने का प्रयास करें (यह आपके द्वारा हटाने की अनुमति वाली किसी भी फ़ाइल के लिए काम करता है)

'-I' पैरामीटर आपको प्रत्येक निर्देशिका प्रविष्टि ls -li के लिए इनकोड नंबर देगा

27 ----------  1 owner  group       3981 Oct 11 04:42 ?????

एक बार जब आपके पास इनोड नंबर ...

find . -inum **27** -exec rm -i {} \;

2
+1 क्योंकि यह इन समस्याओं के लिए एक महान सामान्य उत्तर है। जिस तरह से हाल ही में खोजने के में इस्तेमाल किया -exec rm करने की कोई जरूरत नहीं theres करके, सिर्फ -delete का उपयोग
Sirex

2
@ साइरेक्स - मुझे लगता -exec rm -i {}है कि -iहटाने के लिए संकेत देना चाहिए। मैं देख रहा हूँ man findऔर ऐसा करने का कोई तरीका नहीं देख रहा हूँ ।
स्टीफन पी।

ओह हाँ, इस मामले में। एक टिप के अधिक था।
सेरेक्स

13

देना rm ./- एक कोशिश।

-एक ध्वज एक ध्वज तर्क शुरू करने के लिए है। यदि आप -इस मामले में, लेकिन कुछ के साथ तर्क शुरू करते हैं/ , यह मान लेंगे कि यह फ़ाइल नाम है। जो आपकी इच्छा हो।

और चूंकि fileऔर ./fileएक ही फाइल हैं, यह नाम -से फाइल को लक्षित करेगा ./-


8
30 अक्षरों को टाइप करने के बजाय, शायद यह समझाने के लिए अधिक उपयोगी होगा कि / सही तरीके से पार्स करने में मदद क्यों करता है
Ivo Flipse

@gcb प्रस्तावित संपादन के लिए धन्यवाद। मैंने उस पर कोड मार्कअप जोड़ा है, इसलिए इसे पढ़ना आसान होगा।
slhck

7

अधिकांश उत्तर के रूप में geeky के रूप में नहीं, लेकिन मैं mcआधी रात के कमांडर की एक आग लगाऊंगा , और बस फ़ाइल का चयन और हटा दूंगा।


+1 ने चतुराई से इस मुद्दे को भुनाया - और वह भी बिना जीयूआई कार्यक्रम का सहारा लिए।
११


6

ऐसा नहीं है कि यहां पर्ल का उपयोग करना आवश्यक है, लेकिन यह काम करना चाहिए:

perl -e 'unlink "-"'

या यह देखने के लिए कि ऊपर वाली कोई त्रुटि क्या हो सकती है:

perl -e 'unlink "-" or die "Err: $!"'

इस पद्धति का लाभ यह है कि चिंता करने के लिए कोई विशेष वर्ण नहीं हैं (स्ट्रिंग उद्धरण मुद्दों के अलावा)।
केविन रीड

3

बुरी तरह से नामित फ़ाइलों को हटाने के लिए मुझे गनोम के नॉटिलस का उपयोग करने का सौभाग्य मिला है। क्या आप एक एक्स-सर्वर चला रहे हैं? मुझे यकीन है कि अन्य फ़ाइल ब्राउज़र भी काम करेंगे।


3

अगर

rm -- -

काम नहीं किया, फ़ाइल का नाम "सिर्फ एक हाइफ़न" नहीं है। यदि अन्य फ़ाइलों में कोई हाइफ़न नहीं है, तो आप कोशिश कर सकते हैं

perl -E'for (@_) { if (/-/) { unlink($_) or die $! } }' -- *

1

अब तक मुझे हर पोस्ट के लिए एक "ऐसी कोई फ़ाइल या निर्देशिका" नहीं मिली है:

rm ./-
rm -- -
mv "-" test.txt
rm -rf '-' <-- this gives no error, but doesn't work
perl -e 'unlink "-";'  <--also no error, doesn't work.

ऐसा प्रतीत होता है कि मुझे rm संस्करण 7.4 मिला है। मैं इन सुझावों को अपग्रेड करने और पुनः प्रयास करने का प्रयास करूंगा। मदद करने के लिए सभी को धन्यवाद।


1
मैं अनुमान लगा रहा हूं कि ऐसी कोई फ़ाइल या निर्देशिका नहीं है, और शायद फ़ाइल नाम में कुछ अदृश्य वर्ण (अक्षर) भी हैं। (और आप 'अनलिंक' - "या मरो" इर्र: $! "') के साथ पर्ल में एक ही त्रुटि संदेश प्राप्त कर सकते हैं। असली फ़ाइल नाम क्या है यह देखने के लिए "ls -b" आज़माएं।
रनिंग

1

मुझे इस्तेमाल करने का बहुत शौक है dired इस तरह की चीज़ों के लिए emacs में मोड है - बस emacs में डायरेक्टरी को "ओपन" करें। आप आसानी से फ़ाइलों का चयन कर सकते हैं और उन्हें हटाने के लिए चिह्नित कर सकते हैं।

एक अन्य पोस्टर ने मध्यरात्रि कमांडर का उपयोग करने का सुझाव दिया; यह बहुत ही समान विचार है, लेकिन यदि आप पहले से ही एक emacs उपयोगकर्ता हैं तो यह शायद अधिक सुविधाजनक है।


0

करने में सक्षम होना चाहिए rm -f '-'साइबरगन में मेरे लिए काम

उस बात के लिए, rm -लाल टोपी पर भी काम करने लगता है।


उबंटू में: ~ / jj $ rm -rf '-' ~ / jj $ ls -

rm -मेरे लिए भी काम करता है।
uzsolt

1
क्यों -आर? यदि आपको इसकी आवश्यकता नहीं है तो एक पुनरावर्ती विलोपन का अनुरोध करना गलतफहमी के मामले में हमेशा खतरनाक होता है।
हंस-पीटर स्टॉर

@ ह्स्तोएर, अच्छी बात। बस खरगोश। हाथ दिमाग की तुलना में तेजी से टाइप होते हैं। संपादन प्रतिक्रिया अब, धन्यवाद।
लुकास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.