อย่างใดคำสั่ง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"
บันทึก
คำตอบด้านล่างช่วยให้ฉันเห็นว่ามีช่องว่างต่อท้ายในชื่อ
ls test\
... จะเกิดอะไรขึ้นถ้าคุณใช้ls "*tftp.list*"
? หรือใช้ls
กับ--show-control-chars
?
echo tftp* | xxd
หรือ hexdump อื่น ๆ ?
printf '<%q>\n' tftp*
อะไร
en_US.UTF-8
, ls -b
จะไม่แสดงช่องว่างในชื่อไฟล์ในทางใด ๆ เป็นพิเศษไม่ว่าจะอยู่ตรงกลางหรือที่ส่วนท้ายของชื่อไฟล์ คุณสามารถใช้หนึ่งในคำตอบ (printf, echo) หรือเอาท์พุทของตัวกรอง ls ด้วยโปรแกรมที่ออกแบบมาเพื่อเน้นช่องว่างต่อท้ายเช่นls -1 tftp* | cat -vet