'ls' แสดงไฟล์ที่เหมือนกันสองไฟล์ในไดเรกทอรี


14

อย่างใดคำสั่งlsดูเหมือนว่าจะแสดงให้ฉันสองไฟล์ที่เหมือนกันในไดเรกทอรี

$ ls -Blah /System/Library/LaunchDaemons
total 32                                                              
drwxr-xr-x  266 root  wheel   8.8K Jun 18 10:41 .
drwxr-xr-x   79 root  wheel   2.6K Mar 31 12:28 ..
[redacted]
-rw-r--r--    1 root  wheel   715B Jun 18 10:36 tftp.plist
-rw-r--r--    1 root  wheel   715B Jun 18 10:35 tftp.plist

ฉันสามารถย้ายเปลี่ยนชื่อแก้ไข ฯลฯ ไฟล์อย่างใดอย่างหนึ่ง แต่อีกอันหนึ่งดูเหมือนจะไม่อยู่ที่นั่นด้วยซ้ำ bashความสมบูรณ์ของแท็บจะแสดงไฟล์ที่เหมือนกัน

ตัวอย่างเช่นป้อนต่อไปนี้แล้วกดปุ่ม TAB

$ sudo mv /System/Library/LaunchDaemons/tftp
tftp.plist   tftp.plist

หากฉันเปลี่ยนชื่อไฟล์:

$ sudo mv /System/Library/LaunchDaemons/tftp.plist /System/Library/LaunchDaemons/tftp.plist.derp

ความสมบูรณ์ของแท็บยังคงแสดงไฟล์:

$ ls -Blah /System/Library/LaunchDaemons/tf
tftp.plist       tftp.plist.derp 

แต่ไฟล์ต้นฉบับที่ไม่มีการแก้ไขจะไม่ปรากฏเป็น 'ls'

$ ls -Blah /System/Library/LaunchDaemons/tftp.plist
ls: /System/Library/LaunchDaemons/tftp.plist: No such file or directory

อย่างไรก็ตามหากฉันเพิ่งแสดงรายการไฟล์ในโค้ดแรกด้านบนให้ดู:

$ ls -Blah /System/Library/LaunchDaemons
total 32                                                              
drwxr-xr-x  266 root  wheel   8.8K Jun 18 10:41 .
drwxr-xr-x   79 root  wheel   2.6K Mar 31 12:28 ..
[redacted]
-rw-r--r--    1 root  wheel   715B Jun 18 10:35 tftp.plist
-rw-r--r--    1 root  wheel   715B Jun 18 10:36 tftp.plist.derp

ความคิดใด ๆ ที่เกิดขึ้นที่นี่และฉันจะกำจัดไฟล์ผีนี้ได้อย่างไร

นี่คือ mac ที่ใช้ OS X หากเพิ่มข้อมูลใด ๆ ลงในปัญหา ฉันใช้sedไฟล์นี้ก่อนที่ความบ้าคลั่งจะเริ่มขึ้น

แก้ไข

ฉันใช้ทั้งblahและBlah lsแฟล็กโดยไม่มีการเปลี่ยนแปลงในเอาต์พุตที่ชัดเจน

แก้ไข 2

ข้อมูลเพิ่มเติมที่ร้องขอในความคิดเห็น:

$ echo tftp* | xxd
0000000: 7466 7470 2e70 6c69 7374 2020 7466 7470  tftp.plist  tftp
0000010: 2e70 6c69 7374 2e64 6572 700a            .plist.derp.

มากกว่า:

$ printf '<%q>\n' tftp*
<tftp.plist\ >
<tftp.plist.derp>

มากไปกว่านั้น:

$ locale                                                                                                                      │-rw-r--r--    1 root  wheel   495B Sep  9  2014 org.net-snmp.snmpd.plist
LANG="en_US.UTF-8"                                                                                                            │-rw-r--r--    1 root  wheel   498B Jan 15 23:15 org.ntp.ntpd.plist
LC_COLLATE="en_US.UTF-8"                                                                                                      │-rw-r--r--    1 root  wheel   1.0K Nov 13  2014 org.openldap.slapd.plist
LC_CTYPE="en_US.UTF-8"                                                                                                        │-rw-r--r--    1 root  wheel   572B Sep  9  2014 org.postfix.master.plist
LC_MESSAGES="en_US.UTF-8"                                                                                                     │-rw-r--r--    1 root  wheel   238B Sep  9  2014 shell.plist
LC_MONETARY="en_US.UTF-8"                                                                                                     │-rw-r--r--    1 root  wheel   941B Sep  9  2014 ssh.plist
LC_NUMERIC="en_US.UTF-8"                                                                                                      │-rw-r--r--    1 root  wheel   260B Sep  9  2014 telnet.plist
LC_TIME="en_US.UTF-8"                                                                                                         │-rw-r--r--    1 root  wheel   715B Jun 18 10:36 tftp.plist
LC_ALL="en_US.UTF-8"

บันทึก

คำตอบด้านล่างช่วยให้ฉันเห็นว่ามีช่องว่างต่อท้ายในชื่อ


6
เป็นไปได้ไหมว่าคุณมีช่องว่างท้ายชื่อ?
fredtantini

อืมม ... ไม่เสร็จจะทำls test\ ... จะเกิดอะไรขึ้นถ้าคุณใช้ls "*tftp.list*"? หรือใช้lsกับ--show-control-chars?
fredtantini

1
คุณสามารถเรียกใช้สิ่งที่ชอบecho tftp* | xxdหรือ hexdump อื่น ๆ ?
choroba

2
ผลลัพธ์ของprintf '<%q>\n' tftp*อะไร
Chris Down

3
เนื่องจากสถานที่ของคุณคือen_US.UTF-8, ls -bจะไม่แสดงช่องว่างในชื่อไฟล์ในทางใด ๆ เป็นพิเศษไม่ว่าจะอยู่ตรงกลางหรือที่ส่วนท้ายของชื่อไฟล์ คุณสามารถใช้หนึ่งในคำตอบ (printf, echo) หรือเอาท์พุทของตัวกรอง ls ด้วยโปรแกรมที่ออกแบบมาเพื่อเน้นช่องว่างต่อท้ายเช่นls -1 tftp* | cat -vet
Mark Plotnick

คำตอบ:


22

คุณมีช่องว่างต่อท้ายหรือระบบไฟล์เสียหาย

ลอง

for i in tftp.plist*
do
    echo "'$i'"
done

ที่ควรส่งออกสิ่งที่ต้องการ

'tftp.plist'
'tftp.plist '

สังเกตคำพูดและพื้นที่พิเศษ ถ้ามันออกมาเหมือนกันสองครั้งคุณน่าจะมีระบบไฟล์ที่เสียหาย

ลอง

ls -i tftp.plist*

สิ่งนี้จะทำให้คุณมีหมายเลขไอโหนดของไฟล์ หากพวกเขาเหมือนกันคุณมีไฟล์เดียวกันสองครั้งในไดเรกทอรีของคุณ นั่นจะแย่มาก (tm) และคุณควรเรียกใช้ fsck asap แต่ฉันสงสัยว่าเป็นปัญหา เป็นไปได้ว่าสิ่งที่ช่องว่าง


ความคิดใดที่ว่าทำไมช่องว่างต่อท้ายไม่ปรากฏขึ้นโดยใช้bหรือตั้งBค่าสถานะด้วย 'ls'
111 ---

@datUser: อะไรจะทำอย่างไรกับเรื่องนี้และคุณจะไม่แสดงตัวอย่างของ-B ls -bอย่างไรก็ตาม-blahคุณควรจะได้เห็นบรรทัดที่ลงท้ายด้วย tftp.plist \
สตีฟเจสซอพ

ใช่ฉันใช้ทั้งbและBและไม่แสดงช่องว่างที่หลบหนีหรือค่าของอักขระที่ไม่พิมพ์ในรูปแบบที่อ่านได้ IMHO แปลกมาก
111 ---

1
คุณสามารถเปลี่ยนเส้นทางการส่งออกของlsลงในแฟ้มและตรวจสอบด้วยlessหรือแก้ไขข้อความ ...
Laszlo Valko

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