วิธีลบไดเรกทอรีที่ไม่สามารถลบได้นี้


40

ฉันยกเลิกการติดตั้งไฟล์ tar ที่เสียหายและจัดการเพื่อจบลงด้วยไดเรกทอรีบางอย่างที่ฉันไม่สามารถลบได้ถ้าฉันพยายามลบมันดูเหมือนว่าหาไม่พบ แต่lsแสดงว่ามันมีอยู่ทั้งทุบตีและหลามด้วย ลักษณะการทำงานที่คล้ายกันยกเว้นขวาหลังจากที่ฉันพยายามที่จะลบมันด้วยrm -rf, lsบ่นไม่สามารถหามันแล้วมันจะแสดงรายการมัน (ดูด้านล่างหลังrm -rf) findคำสั่งแสดงไฟล์ที่เป็นปัจจุบัน แต่ยังคงฉันไม่สามารถคิดวิธีที่จะลบมัน
นี่คือความพยายามของฉัน:

ที่นี่คุณเห็นlsและfindเห็นด้วยเรามีไดเรกทอรี

rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -print0  
./mikeaâcnt 

แต่ฉันไม่สามารถลบได้:

rl]$ find -maxdepth 1 -type d -empty -print0 |  xargs -0 rm -f -v 
rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory
rl]$ ls
mikeaâ??cnt

ฉันสามารถทำได้cdแต่มันว่างเปล่า:

rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ pwd
.../rl/mikeaâcnt


mikeaâ^Á^Äcnt]$ cd ../
rl]$ ls
mikeaâ??cnt

ดูด้านล่างที่ไม่ได้เป็นไฟล์ง่าย ๆ แต่เป็นไดเรกทอรีและlsมีพฤติกรรมที่ตลกหลังจากที่rm -rf มันบอกว่ามันไม่สามารถหาไฟล์แล้วแสดงมันตรงหลัง:

rl]$ rm mikeaâ^Á^Äcnt/
rm: cannot remove `mikeaâ\302\201\302\204cnt/': Is a directory
rl]$ rm -rf  mikeaâ^Á^Äcnt/
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$ 

ดังนั้นนี่คือความพยายามของ python ในการค้นหาไฟล์ แต่ชื่อนั้นไม่สามารถใช้งานได้ในชื่อที่สามารถลบได้:

rl]$ python 
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import shutil
>>> os.listdir('.')
['mikea\xc3\xa2\xc2\x81\xc2\x84cnt']
>>> shutil.rmtree(os.listdir('.')[0] )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/shutil.py", line 204, in rmtree
    onerror(os.listdir, path, sys.exc_info())
  File "/usr/lib64/python2.6/shutil.py", line 202, in rmtree
    names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'

แม้ว่าฉันจะใช้แท็บเสร็จสมบูรณ์ชื่อก็หยิบขึ้นมาใช้ไม่ได้:

rl]$ rm -rf mikeaâ^Á^Äcnt 
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt

ใช้ชื่อที่หลามแสดงด้วย bash ฉันได้รับสิ่งนี้:

rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt"
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt

มีอะไรที่ฉันสามารถทำได้เพื่อกำจัด dir ที่เสียหายนี้หรือไม่? ระบบไฟล์พื้นฐาน (NFS) ดูเหมือนว่าทำงานได้และไม่มีรายงานปัญหาอื่น ๆ และฉันไม่มีปัญหาดังกล่าวจนกว่าไฟล์ tar เสียหาย

แก้ไข: นี่คือการใช้findตัว-execเลือกของตัวเองเพื่อโทรrm

rl]$ find -maxdepth 1 -type d -empty -exec rm -f {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$

แต่ไฟล์ยังคงอยู่ที่นั่น ( lsบ่นว่าหาไฟล์ไม่พบ แต่ก็แสดงให้เห็นอยู่ดี)

แก้ไขครั้งที่ 2:

rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} \;
find: `./mikeaâ\302\201\302\204cnt': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt

ลักษณะการทำงานยังคงไม่เปลี่ยนแปลงไฟล์ยังคงมีอยู่

แก้ไขครั้งที่ 3:

rl]$ ls
mikeaâ??cnt
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} + 
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt

ดูเหมือนจะมีชื่อมากกว่าดูmikeaâcntจากผลลัพธ์ของความพยายามของ python mikea\xc3\xa2\xc2\x81\xc2\x84cntและภาพหน้าจอนี้:

ls เอาท์พุท

แก้ไขครั้งที่ 4: นี่คือความพยายามด้วย wild card:

rl]$ echo * 
mikeaâcnt
rl]$ echo mike* 
mikeaâcnt
rl]$ rm -rf mike*
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt

และสถานที่ของฉัน:

rl]$  locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

แก้ไขที่ 5:

rl]$ ls -i 
ls: cannot access mikeaâcnt: No such file or directory
? mikeaâ??cnt

แต่ยังมีการเปลี่ยนแปลงพฤติกรรมตอนนี้lsและcd ทำสิ่งนี้:

rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt 
mikeaâcnt: No such file or directory.

นี้ได้เกิดขึ้นหลังจากความพยายามที่จะลบฉันคิดว่ามันอาจจะมีปัญหา NFS เป็นข้อเสนอแนะในหนึ่งในคำตอบที่นี่โดย vinc17

แก้ไขที่ 6: นี่คือผลลัพธ์ของlsofและls -a

rl] $ / usr / sbin / lsof mikeaâ ^ Á ^ Äcnt lsof: สถานะข้อผิดพลาดในmikeaâ \ xc2 \ x81 \ xc2 \ x84cnt: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

ด้านบนไม่ถูกต้องนี่คือการlsofร้องขอที่ถูกต้อง: (rl คือไดเรกทอรีหลัก)

rl]$ /usr/sbin/lsof | grep mike | grep rl 
tcsh      11926   mike  cwd       DIR   0,33     4096 19569249 /home/mike/mish/rl
lsof      14733   mike  cwd       DIR   0,33     4096 19569249 /home/mike/mish/rl
grep      14734   mike  cwd       DIR   0,33     4096 19569249 /home/mike/mish/rl
grep      14735   mike  cwd       DIR   0,33     4096 19569249 /home/mike/mish/rl
lsof      14736   mike  cwd       DIR   0,33     4096 19569249 /home/mike/mish/rl
rl]$ 

rl]$ ls -a
ls: cannot access mikeaâcnt: No such file or directory
.  ..  mikeaâ??cnt

7 แก้ไข: ย้ายจะไม่ทำงาน (ฉันพยายามมันก่อนที่ทั้งหมดนี้ แต่ฉันไม่ได้บันทึกเอาท์พุท) แต่มันก็มีปัญหาเช่นเดียวกับlsและrm กับไฟล์

8th แก้ไข: นี่คือการใช้ตัวอักษรฐานสิบหกตามที่แนะนำ:

 rl]$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a    mikea......cnt.
rl]$ rmdir $'mikea\6d69\6b65\61c3\a2c2\81c2\8463\6e74\0acnt' 
rmdir: failed to remove `mikea\006d69\006b651c3\a2c2\\81c2\\8463\006e74': No such file or directory
rl]$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt
rl]$

9th แก้ไข: สำหรับstatคำสั่ง:

 rl]$ stat  mikeaâ^Á^Äcnt 
stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory
 rl]$

ดูเหมือนว่ามันจะเป็นไปได้มากขึ้นจากการส่งออกทั้งหมดมีข้อผิดพลาดหรือพฤติกรรมที่ไม่เหมาะสม NFS อื่น ๆ ตามที่แนะนำในการแสดงความคิดเห็น

แก้ไข 10: นี่คือ strace เอาต์พุตในส่วนสำคัญเนื่องจากมันมีขนาดใหญ่เอาต์พุตหรือคำสั่งทั้งสองนี้:

strace -xx rmdir ./* | grep -e '-1 E'`
strace -xx -e trace=file ls -li`

https://gist.github.com/mikeatm/e07fa600747a4285e460

แก้ไข 11: ดังนั้นก่อนหน้าข้างต้น rmdirฉันสังเกตเห็นว่าฉันสามารถcdเข้าไปในไดเรกทอรี แต่หลังจากrmdirฉันไม่สามารถcdอีกครั้งคล้ายกับเมื่อวานนี้ .และ.. ไฟล์ที่อยู่ในปัจจุบัน:

rl]$ ls
mikeaâ??cnt
rl]$ cd mikeaâ^Á^Äcnt/
mikeaâ^Á^Äcnt]$ ls
mikeaâ^Á^Äcnt]$ ls  -a
.  ..
mikeaâ^Á^Äcnt]$ cd ../

การแก้ไขครั้งสุดท้าย: ฉันเห็นผู้ดูแลระบบท้องถิ่นเกี่ยวกับเรื่องนี้และได้รับการจัดการโดยการเข้าสู่ระบบเซิร์ฟเวอร์และลบออกจากที่นั่น คำอธิบายจากพวกเขาคืออาจเป็นปัญหากับชุดอักขระในชื่อที่ไม่เหมาะสม


มีเหตุผลที่คุณกำลังไพพ์findเอาท์พุทไปยังคำสั่งอื่นแทนที่จะใช้แค่execตัวเลือกมันหรือไม่?
HalosGhost

@HalosGhost มีเหตุผลที่ไม่เห็นการแก้ไขสำหรับข้อมูลเพิ่มเกี่ยวกับคำถามของคุณ
ไมค์-M

2
ในฐานะที่เป็นคนที่มีประสบการณ์น้อยมากกับยูนิกซ์และลีนุกซ์นี่คือความคิดของฉัน: mvลองเปลี่ยนชื่อไดเรกทอรีเพื่อบางสิ่งบางอย่างได้โดยไม่ต้องใช้สัญลักษณ์เหล่านั้น บางทีคุณสามารถลบได้หลังจากนั้น หรือคุณอาจลองย้ายไดเรกทอรีไปยังระดับโฟลเดอร์ที่ลึกกว่า (อาจเป็น wildcard) แล้วลบโฟลเดอร์ที่คุณย้ายไป
Nzall

4
ฉันสงสัยว่าไดเรกทอรีมีอยู่ในหน่วยความจำของไคลเอ็นต์และเซิร์ฟเวอร์หายไปนาน คุณได้ลองติดตั้งแล้วติดตั้งอีกครั้งหรือไม่? คุณลองรีบู๊ตลูกค้าหรือไม่ ลูกค้าอื่นมองเห็นได้หรือไม่
kasperd

6
@ mike-m ดูเหมือนว่าคุณจะได้รับข้อผิดพลาด NFS อาจเป็นในเซิร์ฟเวอร์ NFS อาจเป็นเพราะความเสียหายของระบบไฟล์หรือบนเซิร์ฟเวอร์ ฉันสงสัยว่าคุณสามารถทำสิ่งอื่นได้นอกจากรอให้ผู้ดูแลระบบเซิร์ฟเวอร์ NFS จัดการกับมัน
Derobert

คำตอบ:


11

ข้อความที่ตัดตอนมาจากบทความนี้อาจอธิบายได้ว่าทำไมไดเรกทอรีนั้นปฏิเสธที่จะลบ:

NFSv4 ต้องการให้มีการแลกเปลี่ยนชื่อไฟล์ทั้งหมดโดยใช้ UTF-8 ผ่านสาย ข้อกำหนด NFSv4, RFC 3530 กล่าวว่าชื่อไฟล์ควรเข้ารหัส UTF-8 ในส่วน 1.4.3:“ ในการออกไปเล็กน้อยชื่อไฟล์และไดเรกทอรีจะถูกเข้ารหัสด้วย UTF-8 เพื่อจัดการกับพื้นฐานของความเป็นสากล” ข้อความเดียวกัน พบได้ในส่วน NFS 4.1 RFC (RFC 5661) ที่ใหม่กว่าด้วย 1.7.3 ไคลเอนต์ Linux NFS ปัจจุบันเพียงแค่ส่งชื่อไฟล์โดยตรงโดยไม่ต้องมีการแปลงจากภาษาปัจจุบันไปยังและจาก UTF-8 การใช้ชื่อไฟล์ที่ไม่ใช่ UTF-8 อาจเป็นปัญหาจริงในระบบที่ใช้ระบบ NFSv4 ระยะไกล เซิร์ฟเวอร์ NFS ใด ๆ ที่ตามหลังข้อกำหนด NFS ควรปฏิเสธชื่อไฟล์ที่ไม่ใช่ UTF-8 ดังนั้นหากคุณต้องการให้แน่ใจว่าไฟล์ของคุณสามารถจัดเก็บจากไคลเอนต์ Linux ไปยังเซิร์ฟเวอร์ NFS ได้จริงคุณต้องใช้ชื่อไฟล์ UTF-8 ในคำอื่น ๆ

UTF-8 เป็นแนวทางระยะยาว ระบบต้องรองรับ UTF-8 เช่นเดียวกับการเข้ารหัสที่เก่ากว่าทำให้ผู้คนมีเวลาเปลี่ยนเป็น UTF-8 ในการใช้“ UTF-8 ทุกที่” เครื่องมือทั้งหมดจะต้องได้รับการอัปเดตเพื่อรองรับ UTF-8 ปีที่แล้วนี่เป็นปัญหาใหญ่ แต่ในปี 2554 ปัญหานี้ได้รับการแก้ไขแล้วและฉันคิดว่าวิถีนั้นชัดเจนมากสำหรับระบบต่อท้ายสองสามตัว

ไม่ใช่ลำดับไบต์ทั้งหมดที่ถูกกฎหมาย UTF-8 และคุณไม่ต้องการคิดวิธีแสดงมัน หากเคอร์เนลบังคับใช้ข้อ จำกัด เหล่านี้ตรวจสอบให้แน่ใจว่าอนุญาตให้ใช้ชื่อไฟล์ UTF-8 ได้เท่านั้นไม่มีปัญหา ... ชื่อไฟล์ทั้งหมดจะถูกกฎหมาย UTF-8 ฟังก์ชัน utf8_check C ของ Markus Kuhn สามารถระบุได้อย่างรวดเร็วว่าลำดับนั้นถูกต้อง UTF-8 หรือไม่

ระบบไฟล์ควรกำหนดให้ชื่อไฟล์เป็นไปตามมาตรฐานไม่ใช่เพราะความชั่วร้ายบางอย่างจำเป็นต้องควบคุมผู้คน แต่เพียงเพื่อให้ชื่อสามารถแสดงได้อย่างถูกต้องในภายหลัง การขาดมาตรฐานทำให้สิ่งต่างๆยากขึ้นสำหรับผู้ใช้ไม่ใช่เรื่องง่าย แต่ระบบไฟล์ไม่ได้บังคับให้ชื่อไฟล์เป็น UTF-8 ดังนั้นจึงสามารถมีขยะได้อย่างง่ายดาย


นี่ดูเหมือนจะสะท้อนคำอธิบายจากผู้ดูแลในท้องถิ่นฉันจะทำเครื่องหมายคำตอบนี้เป็นคำตอบที่อธิบายโดยผู้ดูแลระบบ ดูการแก้ไขครั้งสุดท้ายของฉัน
mike-m

19

วิธีหนึ่งในการลบไฟล์ / direcories เช่นนี้คือการอ้างอิง inode ของพวกเขา

วิธีค้นหาไอโหนดสำหรับองค์ประกอบใน dir ปัจจุบัน:

ls -i
14813568 mikeaâcnt

ในการลบสิ่งนี้:

find . -inum 14813568 -delete

โปรดดูการแก้ไขครั้งที่ 5
mike-m

4
ไม่สิ่งนี้จะไม่ลบไฟล์โดย inode นี่จะค้นหาชื่อไฟล์สำหรับ inode ที่กำหนดจากนั้นลบไฟล์ตามชื่อ ไม่สามารถช่วยได้ที่นี่เนื่องจากมีการพยายามใช้ชื่อที่ถูกต้องแล้ว (พร้อมกับความพยายามอื่นที่มีชื่อไม่ถูกต้อง)
Gilles 'หยุดชั่วร้าย'

@Gilles - โดยทางเทคนิคแล้วมันมองหา inode dentry และส่งคืนชื่อไฟล์ แต่ฉันเห็นด้วย
mikeserv

1
@Nicolai ไม่ช่วยฉัน ไดเรกทอรีไม่มีข้อความว่างเปล่าปรากฏขึ้น
diffracteD

1
ใช่เรื่องตลกเกี่ยวกับสิ่งนี้: ไฟล์ที่ฉันพยายามลบมีไว้?เพื่ออ้างอิง inode คุณจะลบมันอย่างไร?
Nic Hartley

7

คุณไม่ควรใช้อักขระที่ไม่ใช่ ASCII ในบรรทัดคำสั่งเนื่องจากอย่างที่คุณเห็นด้วยเหตุผลบางประการพวกเขาไม่จำเป็นต้องสอดคล้องกับชื่อไฟล์ (Unicode มีหลายวิธีในการแสดงตัวอักษรที่เน้นเสียง) สิ่งที่ต้องการ:

rm -rf mike*

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

ดีถ้าcdทำงานแล้วไม่มีเหตุผลว่าทำไมrmหรือlsควรพูดNo such file or directoryเพื่อให้ปัญหาอาจอยู่ในระดับระบบไฟล์

หมายเหตุ: อย่าใช้lsเพื่อค้นหาว่าไดเรกทอรีว่างเปล่าหรือls -aไม่

กระบวนการอื่นอาจยังคงใช้ไดเรกทอรีนี้อยู่ (รวมถึงถ้าเป็น cwd ของบางกระบวนการ) IMHO นั่นคือเหตุผลที่ว่าทำไมมันถึงยังคงมีอยู่ แต่สามารถสร้างข้อผิดพลาดได้เช่นกับls; lsofอาจให้ข้อมูลบางอย่างแก่คุณ แต่ด้วย NFS คุณต้องค้นหาเครื่องที่ใช้ โดยเฉพาะอย่างยิ่งกับ NFS สิ่งนี้สามารถทำให้เกิดข้อผิดพลาดแปลก ๆ ls -aในไดเรกทอรีหลักสามารถแสดง.nfs*ไฟล์ / ไดเรกทอรีในบางกรณี

เมื่อคุณได้:

$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt

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


ฉันได้ลองใช้ wildcard ก่อนหน้านี้แล้วมันไม่ทำงานและฉันไม่สามารถโพสต์ความพยายามนั้นได้ในคำถามของฉันฉันจะอัปเดตพร้อมกับผลลัพธ์
mike-m

ดูการแก้ไขครั้งที่สามของฉัน IMHO นี้เกิดจาก NFS (อาจไม่ใช่ความเสียหาย แต่เป็นแคชที่ไม่ดี) และอาจเป็นไปได้ว่ากระบวนการอื่นกำลังใช้งานไดเรกทอรีอยู่ ในบางกรณีจำเป็นต้องรีบูตทุกสิ่ง (เซิร์ฟเวอร์และไคลเอนต์)
vinc17

บางทีนี่อาจอธิบายสิ่งต่าง ๆ ได้ แต่ฉันไม่แน่ใจเพราะฉันไม่มีสิทธิ์ที่จะทำการทดสอบ ดูการแก้ไขครั้งที่ 5
mike-m

1
@ vinc17 กรุณาอย่าใช้ "แก้ไข" ในคำตอบของคุณเพราะสำหรับผู้อ่านใหม่จะไม่ทำให้รู้สึก (มีอยู่แล้วประวัติศาสตร์แก้ไข)
เบอร์นาร์ด

iv เพิ่มเอาท์พุท lsof บางอย่างไม่แน่ใจว่ามันจะบอกอะไรคุณได้ไหม
ไมค์

3

ผมได้ทดสอบเองโดยใช้find's -execสั่ง:

$ mkdir -p mikeaâcnt
$ ls
mikeaâcnt
$ find -maxdepth 1 -type d -empty -exec rm -rf {} +
$ ls
$ 

โฟลเดอร์ถูกสร้างขึ้นอย่างถูกต้องและลบออกอย่างถูกต้อง

ตามที่ระบุไว้โดย@Igeorgetมีวิธีที่ง่ายยิ่งขึ้นถ้าคุณมี GNU find:

$ find -maxdepth 1 -type d -empty -delete

ฉันยังทดสอบคำสั่งนี้และทำงานอย่างถูกต้อง


และถ้าคุณใช้การค้นหาของ GNU ก็มี-deleteตัวเลือกด้วยเช่นกัน
lgeorget

โปรดดูการแก้ไขที่ 3
mike-m

1

ฉันมีปัญหาเดียวกันฉันเชื่อ ฉันได้เห็นปัญหาที่เกิดขึ้นก่อนหน้านี้ด้วยชื่อไฟล์ของ lsในกรณีนี้แสดงแฟ้มเป็นแต่ฉันก็สามารถที่จะลบมันด้วยâ??rm ☃

นี่นำฉันไปยังวิธีต่อไปนี้เพื่อแปลงชื่อที่ไม่ถูกต้องให้เป็นชื่อที่ถูกต้อง:

ก่อนรับไบต์ของชื่อไฟล์:

$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a    mikea......cnt.

จากนั้นถอดรหัสไบต์เหล่านี้เป็น UTF-8 เพื่อรับตัวเข้ารหัส Unicode โดยใช้อินพุตฐานสิบหกของเว็บไซต์นี้เช่น: http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder

U+006D LATIN SMALL LETTER M character
U+0069 LATIN SMALL LETTER I character
U+006B LATIN SMALL LETTER K character
U+0065 LATIN SMALL LETTER E character
U+0061 LATIN SMALL LETTER A character
U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX character (&#x00E2;)
U+0081 <control> character (&#x0081;)
U+0084 <control> character (&#x0084;)
U+0063 LATIN SMALL LETTER C character
U+006E LATIN SMALL LETTER N character
U+0074 LATIN SMALL LETTER T character

ขอให้สังเกตว่าสิ่งเหล่านี้อยู่ใต้ขอบเขตไบต์ เราได้รับไบต์ต่อไปนี้:

6D 69 6B 65 61 E2 81 84 63 6E 74

หากเราปฏิบัติตามลำดับนี้ที่ UTF-8 เราจะได้รับ:

U+006D LATIN SMALL LETTER M character
U+0069 LATIN SMALL LETTER I character
U+006B LATIN SMALL LETTER K character
U+0065 LATIN SMALL LETTER E character
U+0061 LATIN SMALL LETTER A character
U+2044 FRACTION SLASH character (&#x2044;)
U+0063 LATIN SMALL LETTER C character
U+006E LATIN SMALL LETTER N character
U+0074 LATIN SMALL LETTER T character

และชื่อไฟล์ของคุณคือ: mikea⁄cntโดยใช้เครื่องหมายทับเศษส่วนแทนที่จะเป็นส่วนหน้าธรรมดา rmdirตอนนี้คุณอาจจะผ่านชื่อนี้เพื่อ


ถ้าฉันพบสิ่งนี้อีกครั้งฉันจะจำเรื่องนี้ไว้ สิ่งที่ดี. +1
mike-m

0

หลังจากได้รหัสฐานสิบหกที่ถูกต้องของชื่อไฟล์ / โฟลเดอร์ (โดยใช้วิธีใดก็ตามที่เห็นว่าเหมาะสมฉันอาจเลือกls --show-control-chars | xxd) โครงสร้างพิเศษบางอย่างควรใช้เพื่อจัดการกับตัวละครดังกล่าวเมื่อทำงานภายใต้ bash:

rmdir $'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'

มิฉะนั้นแบ็กสแลชจะถือเป็นวานิลลาแบ็กสแลช


โปรดดูการแก้ไขของฉัน (แก้ไขครั้งที่ 8)
mike-m

@ mike-m แน่นอนว่าไม่มีอยู่เนื่องจากlsมีการขึ้นบรรทัดใหม่ในข้อมูลเอาต์พุตและ "cnt" ซ้ำซ้อน บางทีคุณสามารถลองคัดลอกและวางสายในคำตอบของฉันและดูว่ามันมีประสิทธิภาพหรือไม่
Abel Cheung

ยังไม่ได้: `` `rl] $ rmdir $ 'mikea \ xc3 \ xa2 \ xc2 \ x81 \ xc2 \ x84cnt' rmdir: ล้มเหลวในการลบ` mikeaâ \ 302 \ 201 \ 302 c 204 'ไม่มี: เช่นไฟล์หรือไดเรกทอรี `` `
ไมค์

ในกรณีดังกล่าวมีโอกาสมากที่การรวมกันของปัญหา NFS และโลแคลจะป้องกันไม่ให้ยูทิลิตี้ระบบส่วนใหญ่ผ่านไบต์ที่ไม่ใช่ UTF8 ที่ไม่ถูกต้อง และดูเหมือนว่าการลบไอโหนดจะทำให้สถานการณ์แย่ลง สำหรับตอนนี้วิธีเดียวที่ฉันสามารถคิดคือการตั้งค่าระบบของคุณเพื่อสภาพแวดล้อมสถานที่ฟรี (ใช้ "C" สถานที่สำหรับการLC_*และLANGตัวแปร env) และติดตั้ง NFS โดยไม่ต้องตั้งค่าตัวเลือกตัวอักษรใด ๆ
อาเบล Cheung

0

คุณเคยลองใช้rm -rf ./mikeaâcntหรือrm -rf "./mikeaâcnt"เส้นทางที่แน่นอนหรือไม่? rmลองแทนเช่นrmdir ./mikeaâcntกัน


ส่วนหนึ่งของปัญหาคือการที่ตัวละครใน mikeaâcntดูเหมือนจะไม่เป็นชื่อไฟล์ แต่สิ่งที่ ls แสดงให้ดูที่การแก้ไขที่ 3
ไมค์-M

0

คุณได้ลอง inode ของไฟล์นั้นด้วยstat:

stat mike*

นั่นควรให้หมายเลขไอโหนด (และข้อมูลอื่น ๆ ) จากนั้นคุณสามารถลองลบได้


iv เพิ่มการแก้ไขด้วยstatbehavour,
mike-m

0

ฉันมีปัญหาที่คล้ายกัน คุณมี Gnome, KDE หรือ Xwindow DM บ้างไหม? หากคุณเปิด broser ไฟล์ของคุณและลบไฟล์จากที่นั่น

มันควรจะทำงาน

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

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