नाम में एक हाइफ़न के साथ एक UNIX निर्देशिका हटाना


13

मेरी ओर से एक अस्थिभंग पैंतरेबाज़ी के माध्यम से, मैंने गलती से (उदाहरण के लिए) -ए नामक एक निर्देशिका बनाई, और इसे फाइलों के साथ भरना समाप्त कर दिया।

मैं उक्त निर्देशिका को हटाना चाहता हूँ। मैंने कोशिश की:

rmdir -- -A

लेकिन फिर यह मुझे बताता है कि निर्देशिका में अभी भी फाइलें हैं। और मैं यह नहीं कह सकता कि कैसे निर्देशिका में सीडी को कहा फ़ाइलों को हटाने के लिए।

इस कष्टप्रद निर्देशिका से छुटकारा पाने के लिए मुझे क्या करना चाहिए?


5
सौभाग्य से निर्देशिका का नाम '-rf *' नहीं था।
user1686

पर एक ही stackoverflow और यूनिक्स
डोरियन

जवाबों:


29

उपयोग - हर आज्ञा पर।

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..

11

आप फ़ाइल के सामने ./ रख सकते हैं - इस तरह rm या rmdir व्यवहार नहीं करेगा जैसे कि फ़ाइल नाम एक विकल्प ध्वज है।

आप विकल्प भी जारी कर सकते हैं - जो आरएम को कार्य करने के लिए कहता है जैसे कि सब कुछ के बाद - एक फ़ाइल नाम है और यह किसी अन्य विकल्प को संसाधित नहीं करना चाहिए। वहाँ rm के कायरतापूर्ण पुराने संस्करण हो सकते हैं, जो कि इसका पालन नहीं करते हैं, हालांकि मेरे प्राचीन यूनिक्स के चिड़ियाघर इन दिनों बहुत छोटे हो गए हैं, इसलिए मैं आपको यह नहीं बता सकता कि कौन से या यदि ऐसे संस्करण हैं जो समझ में नहीं आते हैं -।

जब आप किसी भी तरह से डिलीट कर रहे हों तो आपको .// नाम रखने की आदत डालनी चाहिए - आपको कभी नहीं पता कि आपकी डायरेक्टरी में कोई -r या -rf नाम वाली फाइल है या नहीं। आप कह सकते हैं कि आपको हमेशा उपयोग करना चाहिए - लेकिन मुझे लगता है कि ./ अधिक स्वाभाविक है क्योंकि यह स्पष्ट करता है कि "मैं इस निर्देशिका में फ़ाइलों को हटाना चाहता हूं, न कि जो कुछ भी * ग्लोब आउट करने के लिए होता है"



2

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


1
rm -fr ./-A

उपरोक्त आदेश मेरे लिए काम करता है।


0

एक अलग विधि इनोड द्वारा हटाना होगा (यह अन्य वर्णों के साथ फ़ाइलों / निर्देशिकाओं के लिए काम करता है जो सिर्फ rm के साथ हटाना मुश्किल है)।

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$

rm को अभी भी कमांड लाइन पर एक तर्क दिया जाएगा और फिर भी इसे एक विकल्प के रूप में व्याख्या करने का प्रयास करेगा, इसलिए आपको अभी भी इसे अग्रणी डैश को किसी भी तरह (डबल डैश के माध्यम से या डालकर) देखने से रोकने की आवश्यकता है। बाकी का नाम।
क्रिस

''। '' के बाद से यह खोज स्वचालित रूप से प्रीपेंड हो जाएगी। फ़ाइल नाम पास हो जाएगा './-A', या जो भी फ़ाइल को कॉल किया जा सकता है, उसके साथ prepended ./ और ठीक से कमांड के लिए भाग गया।
बॉमगार्ट

Nit: -execनाम से बच नहीं है, और करने की आवश्यकता नहीं है; exec*syscalls में से एक के माध्यम से पारित तर्क वास्तविक नाम है। यह केवल शेल इनपुट है जिसे सही (बिना उद्धरणों के) वास्तविक नाम को पास करने के लिए शेल प्राप्त करने के लिए विशेष अर्धांश जैसे अंतरिक्ष अर्धविराम तारांकन आदि की आवश्यकता होती है। उस ने कहा, find -exec rm -f {}केवल एक फ़ाइल के लिए काम करता है, न कि इस क्यू के लिए निर्देशिका के रूप में; find -exec rm -rf {}संभाल निर्देशिका और भी nonempty निर्देशिका करता है, लेकिन लंघन findऔर बस कर rm -rf ./-Aबहुत आसान है।
dave_thompson_085

0

खोज इस तरह से निर्देशिका को हटा सकती है:

find . -type d -iname '-A' -delete

-1

मैं नाम की निर्देशिका को हटाने का प्रयास कर रहा था -p। @ मू के उत्तर ने वह हासिल कर लिया जो मैं करने में सक्षम नहीं था rm ./-p, जो कि Google खोज के बाद कई वेब पृष्ठों पर व्यापक रूप से उपलब्ध है।

एक अन्य विधि इनोड संख्या का उपयोग करना है। मैंने यहाँ वर्णित विधि का उपयोग किया है:

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

संक्षेप में, निम्नलिखित आदेशों का उपयोग करें:

  1. फ़ाइल या निर्देशिका इनोड संख्या प्रदर्शित करने के लिए।
ls -il
  1. का प्रयोग करें findआदेश का उपयोग कर -exec rm -irfकिसी फ़ाइल के लिए या तर्क -exec rm -ifdrएक निर्देशिका के लिए।
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

सुनिश्चित करें कि आप -fध्वज के भीतर का उपयोग करते हैं, अन्यथा बैश निर्देशिका या फ़ाइल को खोजने में सक्षम नहीं होने की शिकायत करेगा।

पर परीक्षण किया गया:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

1
यह 10 साल पहले से बॉमगार्ट के उत्तर का लगभग डुप्लिकेट है, लेकिन आपको इनवॉइस करते समय rm -dकभी भी और आमतौर पर नहीं की आवश्यकता होती -fहै find, लेकिन आपको -rनिर्देशिका की आवश्यकता होती है और इसे फ़ाइल की आवश्यकता नहीं होती है। जब इस विधि को सही किया गया तब भी यह अनाड़ी और हीन है। एक गैर-रिक्त निर्देशिका के लिए बस rm -fr ./-pएक निर्देशिका के लिए r और अनुमति सेटिंग्स के आधार पर f करें।
dave_thompson_085

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