“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว” เมื่อพยายามลบไฟล์ แต่มีไฟล์อยู่หรือไม่


21

ฉันกำลังพยายามลบภาพ png ที่อัปโหลดไปยังเซิร์ฟเวอร์ของฉันผ่านสคริปต์ PHP เมื่อใดก็ตามที่ฉันพยายามลบทั้งผ่าน ftp และ terminal ฉันได้รับข้อผิดพลาด

No such file or directory

อย่างไรก็ตามเมื่อฉันlsอยู่ใน dir ไฟล์นั้นจะอยู่ในรายการและมันก็จะอยู่ในโปรแกรม ftp ของฉันด้วย ฉันได้ลองสร้างไฟล์ด้วยชื่อเดียวกันและท้ายที่สุดฉันก็ได้ไฟล์สองไฟล์ที่มีชื่อเดียวกัน

ฉันสามารถเปิดไฟล์ที่ไม่มีตัวตนได้ แต่ฉันยังไม่สามารถลบออกได้ ฉันได้ลองรีบูตเซิร์ฟเวอร์ของฉันด้วย ความคิดใด ๆ ที่อาจเป็นปัญหา? ฉันใช้ Ubuntu รุ่น 64 บิต แต่ฉันไม่คิดว่าเป็นปัญหา 32/64 บิต ฉันควรทราบว่าฉันได้ลบไฟล์ png อื่น ๆ มากมายที่อัปโหลดโดยสคริปต์ PHP เดียวกัน

ผลผลิตสำหรับ 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คำสั่งจากไดเรกทอรีใด
heemayl

1
@Samuel เหตุใดจึงแนะนำปัญหาระบบไฟล์ การunlinkโทรจะล้มเหลวในการค้นหาไฟล์ที่ไม่มีอยู่เสมอ เมื่อฉันรันstraceคำสั่งนั้นบนระบบของฉันที่ฉันรู้ว่าฉันไม่มีไฟล์ดังกล่าวมันจะสร้างเอาต์พุตที่คล้ายกัน ฉันไม่คิดว่านั่นหมายความว่าฉันมีปัญหาระบบไฟล์! ดูเหมือนว่ามีความเป็นไปได้มากกว่าที่ชื่อของไฟล์จะแตกต่างจากเล็กน้อยqyxdshyikfr_fishing_timeout.pngและดูเหมือนจะเหมือนกันเนื่องจากข้อ จำกัด ในการlsแสดงชื่อไฟล์ตามที่แนะนำในคำตอบอื่น ๆ
Eliah Kagan

คำตอบ:


21

ฉันได้ลองสร้างไฟล์ด้วยชื่อเดียวกันและท้ายที่สุดฉันก็ได้ไฟล์สองไฟล์ที่มีชื่อเดียวกัน

ที่กล่าวว่าขาดความเสียหายของระบบไฟล์ว่าคุณมีสองไฟล์ที่มีชื่อแตกต่างกันสองชื่อที่ปรากฏเหมือนกันเนื่องจากไม่มีอักขระหรืออักขระที่ไม่พิมพ์ออกมาซึ่งมีลักษณะเหมือนกันในชุด / แบบอักษรของคุณ --escapeตัวเลือกที่จะเป็นเพื่อนของคุณในกรณีดังกล่าวเช่นเดียวกับเครื่องมือเช่นlscat -v

ดังนั้นก็เช่นกัน rm -i -- *

อ่านเพิ่มเติม


ฉันเป็นผู้สร้างไฟล์และชื่อไฟล์ที่อัปโหลด ไม่มีใครได้รับการพยายามที่จะก่อวินาศกรรมเซิร์ฟเวอร์ของฉันเป็นฉันเพียงคนเดียวที่รู้เส้นทางที่สมบูรณ์ไป upload.php แต่rm -i -- *ไม่หลอกลวง
DevinFrench

3
@DevinFrench หากคำตอบนี้แก้ไขปัญหาของคุณได้โปรดทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้โดยคลิกที่เครื่องหมายภายใต้จำนวน upvotes เพื่อให้ผู้ใช้ในอนาคตอาจตระหนักถึงความจริงที่ว่าโซลูชันนี้ได้ผลสำหรับคุณ
kos

1
มีคนอธิบายrm -i -- *คำสั่งได้ไหม
user3731622

จากสิ่งที่ฉันเข้าใจ: การส่งต่อ-i จะแจ้งให้คุณก่อนที่จะลบแต่ละไฟล์ --ก่อนที่จะ*เลือกไฟล์ทั้งหมดโดยไม่คำนึงว่าชื่อมีอักขระพิเศษหรือไม่ ข้อมูลอ้างอิง: https://explainshell.com/explain?cmd=rm+-i+--+*
MoltenMuffins

16

TL; DR:เรียกหาชื่อไฟล์คัดลอกเส้นที่มันปรากฏขึ้นและให้การว่าls -1brm

ตามที่คนอื่น ๆ แนะนำไว้น่าจะเกิดจากข้อ จำกัด ในทางls- และบางโปรแกรมอื่น ๆ รวมถึงไคลเอนต์และซอฟต์แวร์เซิร์ฟเวอร์ - จัดการกับชื่อไฟล์แปลก ๆ เช่นที่ประกอบด้วยอักขระควบคุมโดยค่าเริ่มต้น ความสำเร็จของคุณกับคำตอบของ JdeBPชี้ให้เห็นอย่างมากว่านี่เป็นกรณีแม้ว่ามันจะเป็นการเดิมพันที่ดีแม้ก่อนหน้านั้น

  • สำหรับlsเมื่อเอาต์พุตมาตรฐานคือเทอร์มินัล?อักขระจะถูกพิมพ์แทน ดังนั้นหากคุณไม่ได้ไพพ์lsเอาท์พุทไปยังคำสั่งอื่น ๆ (หรือเปลี่ยนทิศทางไปยังบันทึกเพื่อดู) ชื่อไฟล์ของคุณอาจไม่มีตัวควบคุม แต่มีตัวละครที่มีปัญหาอื่น ๆ - บางทีชื่อไฟล์อาจมีช่องว่างต่อท้ายตัวอย่างเช่น

    พฤติกรรมนี้lsอาจทำให้เกิดความสับสน แต่ไม่ใช่ข้อผิดพลาดสามารถถูกแทนที่ได้โดยผู้ใช้ (ดูด้านล่าง)

  • เมื่อพยายามที่จะเข้าถึงหรือลบไฟล์จากระยะไกลข้อบกพร่องในไคลเอนต์หรือซอฟต์แวร์เซิร์ฟเวอร์สามารถสร้างปัญหาดังกล่าว

    ฉันพบสิ่งนี้ด้วยftpตัวเองหลายครั้งรวมถึงไฟล์ที่ชื่อมีช่องว่างต่อท้าย (นั่นไม่ได้เกิดจากข้อผิดพลาดในไคลเอนต์ ftp ของฉัน) แม้ว่าคุณจะสร้างไฟล์ด้วยตัวเองขึ้นอยู่กับว่าคุณสร้างมันขึ้นมาอย่างไรบางครั้งมันค่อนข้างง่ายที่จะแทรกช่องว่างต่อท้ายโดยไม่ได้ตั้งใจหรือช่องว่างอื่น ๆ อาจดูเหมือนช่องว่างแม้ว่าจะไม่

นี่คือสถานการณ์ที่ls -1b(หรือdir -1) มีประโยชน์:

  • -1บอกlsให้แสดงหนึ่งรายการต่อบรรทัด ด้วยวิธีนี้ไม่มีความสับสนเกี่ยวกับที่หนึ่งชื่อไฟล์จะสิ้นสุดลงและอื่น ๆ เริ่มต้นขึ้น สิ่งนี้มีประโยชน์สำหรับไฟล์ที่มีชื่อแปลก ๆ
  • -bบอกlsให้พิมพ์ลำดับ escape สำหรับอักขระพิเศษใด ๆ เอาต์พุตของls -bสามารถคัดลอกและวางอย่างแท้จริงในคำสั่งโดยไม่มีการเพิ่มข้อความ : อักขระที่มีปัญหาทั้งหมดจะถูกยกมาในลักษณะที่ทำให้เชลล์จดจำได้ว่าเป็นสิ่งที่พวกเขาเป็น

มีข้อแม้เพียงข้อเดียวเท่านั้น: หากอักขระตัวสุดท้ายในบรรทัดปรากฏขึ้นให้\คัดลอกตัวละครตัวหนึ่งหลังจากนั้นเนื่องจากวิธีการ\นี้เป็นการเว้นช่องว่าง

คุณสามารถเรียกใช้ls -1bเช่นนั้นหรือคุณสามารถส่งรูปแบบเปลือกทรงกลมไปที่มัน (เช่นls -1b qyx*) การ Globbing อาจหรือไม่พบไฟล์ขึ้นอยู่กับว่าอักขระควบคุม (หรืออักขระแปลก ๆ ) มีอยู่ในส่วนของชื่อที่ปรากฏในรูปแบบกลมหรือไม่

เมื่อคัดลอก\ชื่อไฟล์ที่อ้างถึง - ที่ให้มาด้วยlsคุณสามารถวางสิ่งนี้ลงในคำสั่ง คุณไม่จำเป็นต้องแก้ไขด้วยตนเอง แต่อย่างใด ในกรณีของคุณตามที่คุณต้องการที่จะลบไฟล์พิมพ์พิมพ์ช่องว่างวางสายและกดrmEnter

อ่านเพิ่มเติม:


1
-bขอบคุณมาก=) และ +1
AB

สิ่งที่ฉันออกจาก OP คือเมื่อฉันสร้างไฟล์ด้วยชื่อเดียวกันในไคลเอนต์ ftp ของฉันเมื่อฉันพยายามลบไฟล์แรกที่ฉันมีปัญหาด้วยมันจะลบไฟล์ใหม่ที่ฉันสร้างขึ้นแทน นั่นคือเหตุผลที่ผมไม่คิดว่าตัวอักษรพิเศษใด ๆ rm -i -- *ที่มีส่วนเกี่ยวข้องและผมก็ยังไม่ทราบว่าสิ่งที่ตัวละครพิเศษตั้งแต่ผมใช้
DevinFrench

@DevinFrench อักขระพิเศษคือช่องว่างที่ท้ายชื่อไฟล์ มันยังอยู่ในlsผลลัพธ์ในคำถาม แต่สามารถเห็นได้ในโหมดข้อความเท่านั้นเมื่อคุณคลิก "แก้ไข"
Izkata

@Izkata โทรดี! ฉันควรคิดว่าจะตรวจสอบว่า นอกจากนี้ยังปรากฏขึ้นเมื่อฉันขยายการแก้ไข 3 ในประวัติการแก้ไข (ชื่อไฟล์แบบเต็มรวมถึงพื้นที่ต่อท้ายจะถูกเน้นด้วยสีเขียวและมองเห็นได้) สิ่งที่คุณพูดเป็นคำอธิบายที่ชัดเจนและถูกต้องที่สุด - ถ้าคุณโพสต์คำตอบอธิบายว่ามันมาจากพื้นที่ต่อท้ายและคุณรู้ได้อย่างไรและคำสั่งใดที่จะลบไฟล์ (ถ้า OP ยังมีอยู่) ฉันรู้ว่าฉันโหวตขึ้นแล้ว
Eliah Kagan

@EliahKagan เรียบร้อยพร้อมรูปภาพ
Izkata

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ยกเว้นที่เป็นประโยชน์อย่างชัดเจน สมมุติว่ารายการ OP ต้องการลบกลายเป็นลิงก์สัญลักษณ์ตัวอย่างเช่นพวกเขายังต้องการค้นหาและยังต้องการลบ การ-deleteกระทำจะไม่ซ้ำซ้อนซ้ำไดเรกทอรี จะไม่คุณคำสั่งตั้งแต่คุณไม่ได้rm -rดังนั้นคุณจะไม่ได้ไปโดยไม่ตั้งใจตีทั้งหมด (ไม่ว่างเปล่า) -typeโฟลเดอร์ที่นี่โดยไม่ได้ใช้
Eliah Kagan

ตกลงให้ฉันสักครู่
AB

ในกรณีของฉันแม้find ... -deleteพูดว่า "ไม่สามารถลบ ... ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"
หยุดทำร้ายโมนิก้า

1

โพสต์ใหม่โดยละเอียดขยายความคิดเห็นของฉันในคำตอบของ Eliah

ปัญหาจะมองไม่เห็น แต่สามารถมองเห็นได้ถ้าคุณรู้ว่าจะต้องค้นหาอะไร: ชื่อไฟล์จะมีช่องว่างในตอนท้าย เนื่องจากคุณคัดลอก / วางlsผลลัพธ์ทั้งหมดจึงสามารถเห็นได้ในคำถามหากคุณเน้นเอาท์พุทหรือแก้ไขโพสต์และเลื่อนเคอร์เซอร์ไปที่จุดสิ้นสุดหรือ (ตามที่ Eliah ชี้ให้เห็น) ดูความแตกต่างในประวัติการแก้ไข ฉันเน้น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ผลลัพธ์เป็นพิเศษเพราะมีสิ่งที่คล้ายกันเกิดขึ้นใน StackOverflow หนึ่งครั้ง (และเป็นเหตุผลทั้งหมดที่ฉันคิดว่าจะมองหาสิ่งนี้): บางคนมีตัวละครที่ไม่สามารถพิมพ์ได้ในรหัสของพวกเขา เป็นเพราะผู้ใช้ที่ยังคัดลอก / วางแทนของใหม่พิมพ์รหัสของพวกเขาเมื่อโพสต์คำถาม
Izkata

0

ครั้งหนึ่งฉันได้สร้างไฟล์เพื่อเปิด Nautilus เป็นรูท แต่ชื่อไฟล์เมื่อเห็นจาก nautilus คือ "File Browser (root)" จากนั้นเมื่อฉันพยายามลบ

$ 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

ดังนั้นฉันจึงมีปัญหานี้และสิ่งเหล่านี้ไม่เหมาะกับฉัน สิ่งที่ใช้ได้ผลคือการสร้างไฟล์ที่มีชื่อเหมือนกันทุกประการ มันเป็นโฟลเดอร์ชื่อตัวอย่าง 1.2.3 ดังนั้นฉันจึงสร้างโฟลเดอร์ใหม่และตั้งชื่อให้เหมือนกับโฟลเดอร์ที่จะไม่ลบ โฟลเดอร์เก่าหายไปและฉันลบโฟลเดอร์ใหม่


0

ฉันมีสถานการณ์ที่คล้ายกันหลังจากใช้rsyncเพื่อสำรองไดเรกทอรีรูปภาพของฉันบน Mac และอ่านบน Ubuntu มีสองไฟล์ (จริง ๆ แล้วไดเรกทอรี) ที่มีชื่อแตกต่างกัน แต่มีเนื้อหาเดียวกัน ฉันลบอันหนึ่งไปยังถังขยะ (โดยใช้ 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 ปรากฎว่าไดเรกทอรีทั้งสองมีหมายเลขไอโหนดเดียวกัน ดูเหมือนลิงค์ยาก ...

วิธีแก้ปัญหานั้นง่ายอย่างน่าประหลาดใจ - ลบข้อมูลในถังขยะโดยคลิกขวาที่ไอคอน หลังจากนั้นไดเรกทอรีทั้งสองก็หายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.