"ऐसी कोई फ़ाइल या निर्देशिका नहीं" जब कोई फ़ाइल निकालने का प्रयास किया जाता है, लेकिन फ़ाइल मौजूद होती है?


21

मैं एक png छवि को हटाने की कोशिश कर रहा हूं जो PHP स्क्रिप्ट के माध्यम से मेरे सर्वर पर अपलोड की गई थी। जब भी मैं इसे FTP और टर्मिनल दोनों के माध्यम से हटाने की कोशिश करता हूं, मुझे त्रुटि मिलती है

No such file or directory

हालाँकि, जब मैं lsडीआईआर में होता हूं , तो फ़ाइल सूचीबद्ध होती है और यह मेरे ftp क्लाइंट में भी सूचीबद्ध होती है। मैंने एक ही नाम से एक फाइल बनाने की कोशिश की है और मैं एक ही नाम के साथ दो फाइल प्राप्त कर रहा हूं।

मैं उस फ़ाइल को खोल सकता हूं जो माना जाता है कि मौजूद नहीं है, लेकिन मैं अभी भी इसे हटा नहीं सकता। मैंने अपने सर्वर को रीबूट करने का भी प्रयास किया है। किसी भी विचार क्या मुद्दा हो सकता है? मैं उबंटू का 64 बिट संस्करण चला रहा हूं, लेकिन मुझे नहीं लगता कि इसका 32/64 बिट मुद्दा है। मुझे यह भी ध्यान देना चाहिए कि मैंने एक ही PHP स्क्रिप्ट द्वारा अपलोड की गई कई अन्य png फ़ाइलों को हटा दिया है।

के लिए आउटपुट ls -l

total 224 
-rw-r--r-- 1 www-data www-data 222838 May 13 04:14 qyxdshyikfr_fishing_timeout.png 
-rw-r--r-- 1 root root 272 May 14 06:54 upload.php

आउटपुट जब कोशिश कर रहा है rm

rm: cannot remove ‘qyxdshyikfr_fishing_timeout.png’: No such file or directory

upload.php: http://pastebin.com/z87eypTY


ls -lनिर्देशिका से आउटपुट को कॉपी पेस्ट करें , साथ ही पूरा rmकमांड और उसका आउटपुट ..
heemayl

@heemayl कुल 224 -rw-r - r-- 1 www-data www-data 222838 मई 13 04:14 qyxdshyikfr_fishing_timeout.png -rw-r - r-- 1 रूट 272 मई 14 06:54 upload.php rm: 'qyxdshyikfr_fishing_timeout.png' को नहीं हटा सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं
DevinFrench

1
@DevinFrench जानकारी जोड़ने के लिए कृपया अपने प्रश्न को संपादित करें।
muru

आप किस निर्देशिका से rmकमांड चला रहे हैं ?
हेमायल

1
@ शमूएल एक फाइलसिस्टम समस्या का सुझाव क्यों देगा? unlinkकॉल हमेशा एक फ़ाइल जो मौजूद नहीं है खोजने के लिए असफल हो जायेगी। जब मैं अपने सिस्टम straceपर उस कमांड को चलाता हूं , जहां मुझे पता है कि मेरे पास ऐसी कोई फाइल नहीं है, तो यह समान आउटपुट का उत्पादन करता है; मुझे नहीं लगता कि यह इंगित करता है कि मेरे पास एक फाइल सिस्टम समस्या है! यह कहीं अधिक संभावना है कि फ़ाइल का नाम इससे थोड़ा अलग है qyxdshyikfr_fishing_timeout.pngऔर केवल उसी रूप में प्रकट होता है जिस तरह से lsफाइलनाम प्रदर्शित करता है, जैसा कि अन्य उत्तरों में सुझाया गया है।
एलिया कागन

जवाबों:


21

मैंने एक ही नाम से एक फाइल बनाने की कोशिश की है और मैं एक ही नाम के साथ दो फाइल प्राप्त कर रहा हूं।

यही कारण है कि कहते हैं, अनुपस्थित फाइल सिस्टम भ्रष्टाचार, आप दो फ़ाइलों है कि दो अलग-अलग नामों के साथ कि एक ही दिखाई देते हैं क्योंकि गैर मुद्रण वर्ण या अक्षर हैं जो अपने चरित्र सेट / font में वैसी ही दिखेगी की। --escapeकरने के लिए विकल्प ls, इस तरह के मामलों में अपने दोस्त के रूप में इस तरह के रूप उपकरण हैं cat -v

तो, भी है rm -i -- *

आगे की पढाई


मैं फ़ाइल का निर्माता और फ़ाइल नाम जो अपलोड किया गया था। कोई भी मेरे सर्वर को तोड़फोड़ करने की कोशिश नहीं कर रहा था क्योंकि मैं एकमात्र व्यक्ति हूं जो अपलोड करने के लिए पूरा रास्ता जानता है। हालांकि, rm -i -- *चाल चली ।
डेविनफ्रेंच

3
@DevinFrench यदि इस उत्तर ने आपकी समस्या को हल कर दिया है, तो कृपया इसे अपवोट काउंट के तहत चिह्न पर क्लिक करके स्वीकार किए गए उत्तर के रूप में चिह्नित करें, ताकि भविष्य के उपयोगकर्ता इस तथ्य से अवगत हो सकें कि यह समाधान आपके लिए काम करता है।
Kos

1
क्या कोई rm -i -- *आज्ञा समझा सकता है ?
user3731622

मुझे जो समझ में आया है: पासिंग -i आपको प्रत्येक फ़ाइल को हटाने से पहले संकेत देगी। --इससे पहले कि *सभी फ़ाइलों का चयन करें चाहे उनके नाम में विशेष वर्ण शामिल हों। संदर्भ: https://explainshell.com/explain?cmd=rm+-i+--+*
मोलटेनमफिन्स

16

टीएल; डीआर: भागो ls -1b, फ़ाइल नाम ढूंढें, उस रेखा को कॉपी करें जिस पर यह दिखाई देता है, और इसे दें rm

जैसा कि दूसरों ने सुझाव दिया है, सबसे अधिक संभावना है कि इस तरह से सीमाओं के कारण ls- और क्लाइंट और सर्वर सॉफ़्टवेयर सहित कुछ अन्य प्रोग्राम - अजीब फ़ाइलनामों को संभालते हैं, जैसे कि नियंत्रण वर्णों को डिफ़ॉल्ट रूप से। JdeBP के उत्तर के साथ आपकी सफलता दृढ़ता से बताती है कि यह मामला था, हालांकि इससे पहले भी यह एक अच्छा दांव था।

  • के लिए ls, जब मानक आउटपुट एक टर्मिनल है, ?पात्रों को उनकी जगह पर मुद्रित कर रहे हैं। इसलिए यदि आप lsकिसी अन्य कमांड को आउटपुट नहीं दे रहे हैं (या इसे देखने के लिए लॉग पर रीडायरेक्ट कर रहे हैं), तो शायद आपके फ़ाइल नाम में नियंत्रण वर्ण नहीं हैं। लेकिन अन्य समस्याग्रस्त पात्र हैं - शायद फ़ाइल नाम में अनुगामी व्हॉट्सएप शामिल है, उदाहरण के लिए।

    यह व्यवहार lsभ्रामक हो सकता है लेकिन बग नहीं है, उपयोगकर्ता द्वारा स्पष्ट रूप से ओवरराइड किया जा सकता है (नीचे देखें)।

  • जब किसी फ़ाइल को दूरस्थ रूप से एक्सेस या निकालने का प्रयास किया जाता है, तो क्लाइंट या सर्वर सॉफ़्टवेयर में बग ऐसी समस्याएँ उत्पन्न कर सकते हैं।

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

यह एक ऐसी स्थिति है जहाँ ls -1b(या dir -1) काम आता है:

  • -1lsप्रति पंक्ति एक प्रविष्टि दिखाने के लिए कहता है। इस तरह से कोई भ्रम नहीं है कि एक फ़ाइल नाम कहाँ समाप्त होता है और दूसरा शुरू होता है। यह अजीब तरह से नामित फ़ाइलों के लिए आसान है।
  • -blsकिसी विशेष वर्ण के लिए एस्केप सीक्वेंस प्रिंट करना बताता है। आउटपुट को ls -bकॉपी किया जा सकता है और इसे सचमुच एक कमांड में चिपकाया जाता है, जिसमें कोई जोड़ा नहीं जाता है : सभी समस्याग्रस्त पात्रों को पहले से ही इस तरह से उद्धृत किया जाता है, जिससे शेल उन्हें पहचानता है कि वे क्या हैं।

केवल एक कैविएट है: यदि किसी लाइन पर अंतिम वर्ण प्रतीत होता है \, तो उसके बाद एक वर्ण की प्रतिलिपि बनाएँ, क्योंकि यह साधन \किसी स्थान को उद्धृत कर रहा है।

आप ls -1bबस ऐसे ही चला सकते हैं , या आप इसे (जैसे ls -1b qyx*) एक शेल ग्लोब पैटर्न पास कर सकते हैं । ग्लोबिंग फ़ाइल को ढूंढ सकता है या नहीं भी सकता है, यह इस बात पर निर्भर करता है कि नियंत्रण वर्ण (या अन्य अजीब अक्षर) ग्लोब पैटर्न में प्रदर्शित नाम के हिस्से में मौजूद हैं या नहीं।

\आपके द्वारा दिए गए फ़ाइलनाम के -quoted संस्करण की प्रतिलिपि बनाते हुए ls, आप इसे एक कमांड में पेस्ट कर सकते हैं। आपको इसे किसी भी तरह से मैन्युअल रूप से संशोधित करने की आवश्यकता नहीं है। आपके मामले में, जैसा कि आप फ़ाइल को हटाना चाहते हैं, टाइप करें rm, स्पेस टाइप करें , लाइन पेस्ट करें, और दबाएं Enter

आगे की पढाई:


1
बहुत अच्छा -bthx =) और +1
AB

ओपी से जो कुछ मैंने छोड़ा था, जब मैंने अपने ftp क्लाइंट में उसी नाम से एक फाइल बनाई थी, जब मैंने पहली फाइल को डिलीट करने की कोशिश की थी, जिसके साथ मुझे समस्या हो रही थी, यह बदले में मेरे द्वारा बनाई गई नई फाइल को डिलीट कर देगा। यही कारण है कि मुझे नहीं लगा कि कोई विशेष वर्ण शामिल थे, और मुझे अभी भी नहीं पता है कि मैं किस विशेष चरित्र का उपयोग कर रहा था rm -i -- *
डेविनफ्रेंच

@DevinFrench अतिरिक्त नाम फ़ाइल नाम के अंत में एक स्थान है। यह अभी भी lsआउटपुट में है, लेकिन केवल टेक्स्ट मोड में देखा जा सकता है जब आप "एडिट" पर क्लिक करते हैं।
इज़काता

@ इज़कट अच्छा कॉल! मुझे लगता है कि जाँच करनी चाहिए। यह तब भी दिखाई देता है जब मैं संपादन इतिहास में संशोधन 3 का विस्तार करता हूं (पूर्ण फ़ाइल नाम, जिसमें अनुगामी स्थान भी शामिल है, हरे रंग में हाइलाइट किया गया है और इस प्रकार)। आपने जो कहा है, वह अब तक का सबसे निश्चित और विशेष रूप से सही स्पष्टीकरण है - यदि आप एक उत्तर देते हुए बताते हैं कि यह एक अनुगामी स्थान से है, और आप कैसे जानते हैं, और क्या कमांड फाइल को हटा देगा (यदि ओपी के पास अभी भी है) , मुझे पता है कि मैं इसे बढ़ा दूंगा।
एलिया कगन

@ एलियाकगन ने किया, तस्वीरों के साथ
इज़्काता

3
  1. findआउटपुट का उपयोग करें और जांचें:

    यदि फ़ाइल नहीं मिली है, तो खोज शब्द को *qyxdshyikfr*थोड़ा छोटा करें , जैसे: *qyxds*या *fishing*

    sudo find . -maxdepth 1 -type f -name "*qyxdshyikfr*"
    
  2. यदि ठीक है, तो findचरण 1 में खोज शब्द के साथ उपयोग करें औरrm

    find . -maxdepth 1 -type f -name "*qyxdshyikfr*" -print0 | xargs -0  rm
    

1
बल्कि बुला से rmसे एक पाइप के माध्यम से नाम से findकरने के लिए xargs, मैं बस उपयोग करने की अनुशंसा findकी -deleteकार्रवाई। इसके अलावा sudoजरूरत नहीं है। कम महत्वपूर्ण रूप से, मैं सुझाव देता हूं कि -type fजहां यह स्पष्ट रूप से मददगार है, वहां छोड़ दें । संभवतः यदि ओपी को हटाना चाहता है तो एंट्रेंस एक प्रतीकात्मक लिंक हो सकता है, उदाहरण के लिए, वे अभी भी इसे ढूंढना चाहते हैं और फिर भी इसे हटाना चाहते हैं। -deleteकार्रवाई रिकर्सिवली एक निर्देशिका पीटना नहीं होगा; rmआपके पास न तो आपकी आज्ञा होगी -r। तो आप गलती से एक पूरे (गैर-रिक्त) फ़ोल्डर का उपयोग नहीं करके यहां जा रहे हैं -type
एलियाह कगन

ठीक है, मुझे एक सेकंड दें।
एबी

मेरे मामले में, यहां तक find ... -deleteकि "हटाए नहीं जा सकते ... ऐसी कोई फ़ाइल या निर्देशिका नहीं" कहा जाता है
रोकें मोनिका

1

एलियाह के जवाब पर मेरी टिप्पणी से विस्तार से, विस्तार से

समस्या अदृश्य है, लेकिन देखा जा सकता है यदि आप जानते हैं कि क्या देखना है: फ़ाइल नाम में अंत में एक स्थान शामिल है। क्योंकि आप पूरे lsआउटपुट को कॉपी / पेस्ट करते हैं , यह प्रश्न में देखा जा सकता है यदि आप आउटपुट को हाइलाइट करते हैं, या पोस्ट को एडिट करते हैं और कर्सर को अंत तक ले जाते हैं, या (जैसा कि एलियाह ने बताया) एडिट हिस्ट्री में अंतर को देखते हैं। मैंने lsइस स्क्रीनशॉट में पोस्ट में आउटपुट पर प्रकाश डाला :

अतिरिक्त जगह

टिप्पणी के साथ समस्या का डुप्लिकेट करने के लिए एक त्वरित छोटा टर्मिनल सत्र:

$ touch 'foo '        # Create file with a space at the end
$ ls -l               # Space is not visible in ls output
total 0
-rw-rw-r-- 1 izkata izkata 0 May 14 21:59 foo 

$ rm foo              # Cannot remove it when not specifying the space
rm: cannot remove ‘foo’: No such file or directory

$ rm 'foo '           # Can remove it if we quote the file name and include the space
$ rm foo\             # Or can escape the space to tell bash to include it as part of the filename

टैब पूरा करने का उपयोग करने से समस्या पूरी तरह से दूर हो जाती है, क्योंकि बैश सही ढंग से रिक्त स्थान से बचने के लिए पर्याप्त स्मार्ट है (यह सामान्य रूप से भी एक अच्छी आदत है, टाइपिंग पथों को इतना गति दें)

उदाहरण के लिए, क्या मैंने टाइप किया था rm f<tab>, यह rm foo\<space><space>ऊपर दिए गए कोड ब्लॉक में अंतिम उदाहरण के रूप में, ऑटो-पूरा होगा ।


मैं lsआउटपुट का कॉपी / पेस्ट करने का विशेष उल्लेख करता हूं क्योंकि ऐसा ही कुछ एक बार स्टैकऑवरफ्लो पर हुआ था (और यही कारण है कि मैंने इस पर विचार करने के लिए सोचा था): किसी को अपने कोड में एक गैर-मुद्रण योग्य चरित्र मिला, और एकमात्र कारण यह है कि किसी ने इसका पता लगाया ऐसा इसलिए है क्योंकि प्रश्न पोस्ट करते समय उपयोगकर्ता अपने कोड को फिर से टाइप करने के बजाय कॉपी / पेस्ट करता है
इज़्काता

0

एक बार, मैंने Nautilus को रूट के रूप में खोलने के लिए एक फ़ाइल बनाई है, लेकिन nautilus से देखने पर फ़ाइल का नाम "फ़ाइल ब्राउज़र (रूट)" था, तब जब मैंने इसे हटाने की कोशिश की

$ rm "File Browser (Root)"
$ sudo rm "File Browser (Root)"
$ sudo rm "File Browser (Root).desktop"

मुझे जो एकमात्र एवर मिला वह था: "rm: 'File Browser (Root) .desktop' को हटा नहीं सकता: ऐसा कोई भी"

तब जब मैं चलता हूं:

$ ls -l

मैंने देखा / याद किया कि फ़ाइल का नाम, वास्तव में, "Nautilus-root.desktop" था

तो मैं चला:

$ sudo rm "Nautilus-root.desktop"

मेरे लिए काम किया, आशा है कि यह मदद करता है!


0

इसलिए मुझे यह समस्या थी और इनमें से किसी भी चीज ने मेरे लिए काम नहीं किया। जो काम करता था वह ठीक उसी नाम से एक फाइल बना रहा था। यह एक फ़ोल्डर था जिसका नाम Example.1.2.3 था, इसलिए मैंने एक नया फ़ोल्डर बनाया और इसे उसी नाम दिया, जो डिलीट नहीं होगा। पुराना फ़ोल्डर गायब हो गया और मैंने नया हटा दिया।


0

मेरे पास एक मैक पर rsyncअपनी पिक्चर्स डायरेक्टरी का बैकअप लेने और उबंटू पर पढ़ने के बाद भी ऐसी ही स्थिति थी । अलग-अलग नामों से दो फाइलें (वास्तव में निर्देशिका) थीं, लेकिन एक ही सामग्री थी। मैंने एक को ट्रैश (Nautilus का उपयोग करके) को हटा दिया, लेकिन दूसरे को भी हटा नहीं सका, यहां तक ​​कि कमांड लाइन से भी। यह कहेंगे:

$ rmdir Pictures
rmdir: failed to remove 'Pictures': No such file or directory
$ rm Pictures
rm: cannot remove 'Pictures': Is a directory

Ls -i -l के साथ इनोड संख्याओं की जाँच करने के बाद यह पता चला कि दोनों निर्देशिकाओं में एक ही इनोड संख्या है। कड़ी कड़ी लगती है ...

समाधान आश्चर्यजनक रूप से सरल था - आइकन पर राइट क्लिक करके ट्रैश को खाली करें। इसके बाद दोनों डायरेक्टरी चले गए।

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