ไม่สามารถลบ / ย้ายไฟล์ด้วยอักขระพิเศษในชื่อไฟล์


17

ดังที่คุณเห็นด้านล่างไฟล์มีอักขระที่ผิดปกติ

ภาพหน้าจอตัวจัดการไฟล์

การลบมันในเทอร์มินัลหรือโลมาส่งคืนข้อผิดพลาด:

ไม่พบไฟล์หรือโฟลเดอร์ที่คุณค้นหา

ทำงานls -laในไดเรกทอรีให้ผลลัพธ์นี้:

-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h

ฉันรันfsckคำสั่งบนพาร์ติชันจากระบบปฏิบัติการอื่น แต่ไม่เปลี่ยนแปลงอะไรเลย

ฉันจะลบไฟล์เหล่านี้ได้อย่างไร


1
คุณได้ตั้งค่าระบบของคุณให้มีโฮมไดเร็กตอรี่ที่เข้ารหัสหรือไม่
dobey

@dobey ฉันไม่ได้
karjedavpalaa

5
@Panther คุณเข้าใจผิด นี่คือไม่ได้ด้วยตัวเองข้อบ่งชี้ของระบบไฟล์เสียหายและแม้ว่าจะได้รับเกิดจากความเสียหายของข้อมูลบางชนิด fsck จะไม่ทำอะไรกับมัน
zwol


1
ฉันมีไฟล์ที่มีชื่อผู้ไม่รู้จักในชื่อ การเปลี่ยนชื่อไฟล์ทำงาน จากนั้นสามารถลบได้
ravery

คำตอบ:


35

วิธีง่ายๆในการลบไฟล์เหล่านี้โดย inode ของพวกเขา :)

ใช้ls -liในไดเรกทอรีที่มีอักขระผิดปกติเพื่อแสดงหมายเลข inode ของแต่ละไฟล์เช่น

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

จากนั้นใช้findยูทิลิตีนี้เพื่อลบไฟล์ที่เกี่ยวข้องตามชื่อโดยใช้ไวยากรณ์find <somepath> -inum <inode_number> -exec rm -i {} \;ดังตัวอย่างต่อไปนี้:

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

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

หากคุณต้องการลบไฟล์หลายไฟล์โดย inodes คุณสามารถใช้ไวยากรณ์-o(ความหมายหรือ ) สำหรับfind:

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

คุณสามารถเพิ่มหมายเลขไอโหนดได้มากขึ้นโดยขยายนิพจน์ในวงเล็บด้วย-o -inum <inode_number>นิพจน์เพิ่มเติม


4
แล้วไงrm -ri .ล่ะ
Brent Baccala

สิ่งนี้ใช้งานได้: ค้นหา <somepath> -inum <inode_number> -exec rm -i {} \; '-inum', '{}' และ '\' ทำอะไรในคำสั่ง
karjedavpalaa

ฉันจะลบไฟล์หลายไฟล์พร้อมกันได้อย่างไร นอกจากนี้ขอบคุณคุณทำวันของฉัน!
karjedavpalaa

2
@BrentBaccala rm -ri .ไม่ได้ทำการลบไฟล์โดย inode แต่ มันจะคืนค่าผ่านไดเร็กตอรี่การทำงานทั้งหมดและขอให้แต่ละไฟล์ถ้าคุณต้องการลบมัน - และคุณจะต้องให้ความใส่ใจเป็นอย่างมากว่าไฟล์ใดที่มันกำลังร้องขอเพื่อที่จะไม่ลบไฟล์ที่ไม่ต้องการโดยไม่ตั้งใจ แน่นอนฉันไม่ต้องการใช้คำสั่งนี้สำหรับไดเรกทอรีบ้านของฉัน - มันมีไฟล์จำนวนมาก ;)
Malte Skoruppa

3
@karjedavpalaa (1) -inumบอกfindให้ค้นหาไฟล์ตามหมายเลข inode (2) {}ตรงกับแฟ้ม (s) grepพบโดย (3) \ หนี;สัญลักษณ์ซึ่งยุติคำสั่งส่งผ่านไปยังตัวเลือกในการ-exec find(4) ฉันได้แก้ไขคำตอบของฉันเพื่ออธิบายวิธีลบหลายไฟล์ในครั้งเดียว
Malte Skoruppa

13

สิ่งสำคัญคือต้องเข้าใจว่านี่ไม่ใช่ "ความเสียหายของระบบไฟล์" ที่fsckจะช่วยได้ ตราบใดที่ระบบไฟล์มีความเกี่ยวข้องชื่อไฟล์สามารถเป็นลำดับใด ๆ ของไบต์ตราบใดที่ไม่มีไบต์เดียวมีค่า 0x00 (ASCII NUL, C-end-of-string marker) หรือ 0x2F ( /ตัวคั่นไดเรกทอรี) (หากชื่อไฟล์มีขนาด 00 หรือ 2F ฝังอยู่ภายในfsckควรแก้ไขด้วย)

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

หากคุณต้องการทำอะไรบางอย่างเกี่ยวกับพวกเขาจากเชลล์ (ตัวอย่างเช่นหากพวกเขาเป็นเจ้าของrootและดังนั้นจึงไม่สามารถแก้ไขได้โดยโปรแกรม GUI) คุณสามารถตั้งชื่อพวกมันโดยอ้อมโดยใช้รูปแบบ "glob" ซึ่งจะขยายไปยังลำดับที่ถูกต้อง (s) ของไบต์และผ่านไป

แน่นอนว่าคุณไม่ต้องการลบข้อมูลโดยไม่ตั้งใจเพราะรูปแบบกลมของคุณตรงกันมากเกินไปดังนั้นคำแนะนำของฉันคือการใช้renameโปรแกรมอรรถประโยชน์Perl เพื่อแปลงชื่อไฟล์แต่ละไฟล์ให้เป็นการเข้ารหัส hex:

$ rename '$_ = unpack("H*", $_)' *

สิ่งนี้จะไม่ทำลายข้อมูลใด ๆ - ทั้งไฟล์เองและความหมายใด ๆ ที่อาจถูกเข้ารหัสไว้ในชื่อไฟล์ก่อนที่จะถูกทำให้ยุ่งเหยิง มันสามารถยกเลิกได้สำหรับไฟล์เฉพาะด้วยเช่น

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

ข้อควรระวัง: มีสองโปรแกรมชื่อrenameจากต้นกำเนิดที่แตกต่างกัน คำสั่งดังกล่าวจะทำงานเฉพาะกับคนที่มากับ Perl ใน Ubuntu สิ่งที่คุณต้องการคือสิ่งที่มาจากแพ็คเกจ "เปลี่ยนชื่อ" ไม่ใช่จากแพ็คเกจ "util-linux" rename -hจะแยกแยะ: นี่คือสิ่งที่คุณต้องการ ...

$ rename -h
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# ...

... นี่ไม่ใช่สิ่งที่คุณต้องการ ...

$ rename -h

Usage:
 rename [options] <expression> <replacement> <file>...
# ...

สิ่งสำคัญในการค้นหาคือ "perlexpr" คุณอาจมีการเปลี่ยนชื่อ Perl รุ่นเก่าที่ไม่เข้าใจตัวเลือกทั้งหมดข้างต้น แต่คำสั่งที่ฉันแสดงควรยังคงใช้งานได้

แก้ไข: ภายใต้ 14.04 .5 สคริปต์ perl ที่รวมไว้renameไม่รองรับสวิตช์ -h คุณสามารถยืนยันได้ว่าคุณมีสิ่งที่ถูกต้องโดยการตรวจสอบมันเป็นหน้าคนที่มีman renameในกรณีที่บรรทัดบนจะมี:

RENAME (1) คู่มืออ้างอิงโปรแกรมเมอร์ Perl RENAME (1)


rename --version ตัวเลือกที่ไม่รู้จัก: รุ่น
Elder Geek

@ElderGeek file $(which rename)พิมพ์อะไร? (ตรวจสอบให้แน่ใจว่าคุณได้fileติดตั้งแพ็คเกจแล้ว)
zwol

/usr/bin/rename: symbolic link to /etc/alternatives/rename( fileติดตั้งโดยค่าเริ่มต้น) ที่จริงแล้วคุณต้องไล่ลิงก์สัญลักษณ์เพื่อให้ได้/usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable แต่man renameเป็นตัวบ่งชี้ที่รวดเร็วกว่า ...
Elder Geek

@ElderGeek ถ้ามัน Perl สคริปต์แล้วมันอาจจะเป็นรุ่นเก่าของ "หนึ่งที่มีต้นกำเนิดกับ Perl" ที่ไม่สนับสนุน--version; คำสั่งที่ฉันแนะนำยังคงใช้ได้อยู่ (/usr/share/doc/rename/changelog.gz บนคอมพิวเตอร์ของฉันซึ่งใช้ Debian ไม่เสถียรแสดงว่า--versionเพิ่มในเวอร์ชัน 0.10 ของการเปลี่ยนชื่อ Perl ในปี 2013 ฉันประหลาดใจที่ Ubuntu ยังคงจัดส่งบางอย่างที่เก่ากว่านั้น แต่โปรแกรมนี้ไม่ได้เปลี่ยนฟังก์ชั่นการใช้งานจริงมาตั้งแต่ปี 2007 (!) ดังนั้นก็ใช้ได้เลย)
zwol

อา! นั่นอธิบายความสับสน แม้จะมีการเรียกร้องที่ตรงกันข้าม Debian ไม่ใช่ Ubuntu ฉันไม่สามารถพูดได้สำหรับทุกรุ่น แต่บางรุ่นที่รองรับในปัจจุบันของ Ubuntu LTS (14.04) ยังไม่มี (แม้ว่าจะมี 16.04 ก็ตาม)
Elder Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.