'ls' hiển thị hai tệp giống nhau trong một thư mục


14

Vì vậy, bằng cách nào đó lệnh lsdường như hiển thị cho tôi hai tệp giống hệt nhau trong một thư mục.

$ 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

Tôi có thể di chuyển, đổi tên, chỉnh sửa, vv một trong các tệp, nhưng một trong những tệp khác thậm chí không có ở đó. bashhoàn thành tab thậm chí hiển thị các tập tin giống hệt nhau.

Ví dụ: nhập nội dung sau rồi nhấn TAB

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

Nếu tôi đổi tên tập tin:

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

Tab hoàn thành vẫn hiển thị tệp:

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

Nhưng tệp gốc, chưa sửa đổi không xuất hiện thành 'ls'

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

Tuy nhiên nếu tôi chỉ liệt kê các tệp như trong đoạn mã đầu tiên ở trên, hãy xem:

$ 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

Bất cứ ý tưởng những gì đang xảy ra ở đây và làm thế nào tôi có thể thoát khỏi tập tin ma này?

Đây là máy mac chạy OS X nếu có thêm bất kỳ thông tin nào cho sự cố. Tôi đã sử dụng sedtrên tập tin này ngay trước khi sự điên rồ bắt đầu.

Biên tập

Tôi đã sử dụng cả cờ blahBlah lscờ mà không thay đổi đầu ra rõ ràng.

Chỉnh sửa 2

Thông tin bổ sung được yêu cầu trong ý kiến:

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

Hơn:

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

Thậm chí nhiều hơn:

$ 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"

Ghi chú

Câu trả lời dưới đây đã giúp tôi thấy rằng có một khoảng trống trong tên.


6
Có thể là bạn có một dấu cách trong tên?
fredtantini

Hmmmật Không, hoàn thành sẽ làm ls test\ điều gì xảy ra nếu bạn sử dụng ls "*tftp.list*"? hay dùng lsvới --show-control-chars?
fredtantini

1
Bạn có thể chạy một cái gì đó như echo tftp* | xxdhoặc một số hexdump khác?
choroba

2
Đầu ra của printf '<%q>\n' tftp*cái gì?
Chris Xuống

3
Vì ngôn ngữ của bạn là en_US.UTF-8, ls -bsẽ không hiển thị khoảng trống trong tên tệp theo bất kỳ cách đặc biệt nào, cho dù ở giữa hoặc ở cuối tên tệp. Bạn có thể sử dụng một trong các câu trả lời (printf, echo) hoặc bộ lọc đầu ra của ls với một chương trình được thiết kế để làm nổi bật các khoảng trống theo sau nhưls -1 tftp* | cat -vet
Mark Plotnick

Câu trả lời:


22

Bạn có khoảng trắng ở cuối hoặc hệ thống tệp bị hỏng.

Thử

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

Điều đó sẽ tạo ra một cái gì đó như

'tftp.plist'
'tftp.plist '

lưu ý các trích dẫn và không gian thêm. Nếu nó xuất ra cùng một thứ chính xác hai lần, bạn có thể có một hệ thống tập tin bị hỏng.

Thử

ls -i tftp.plist*

điều này sẽ cung cấp cho bạn số inode của tập tin. Nếu chúng giống nhau, bạn có cùng một tệp hai lần trong thư mục của mình. Điều đó sẽ thực sự tồi tệ (tm), và bạn nên chạy fsck asap. Nhưng tôi nghi ngờ đó là vấn đề; nhiều khả năng đó là điều khoảng trắng.


Bất cứ ý tưởng tại sao khoảng trắng theo sau không hiển thị bằng cách sử dụng bhoặc Bcờ với 'ls`?
111 ---

@datUser: -Bkhông liên quan gì đến điều này và bạn không đưa ra ví dụ về ls -b. Tuy nhiên, với -blahbạn chắc chắn đã thấy một dòng kết thúc tftp.plist \
Steve Jessop

Vâng, tôi đã sử dụng cả hai bBkhông hiển thị không gian thoát hoặc giá trị của ký tự không in ở định dạng có thể đọc được. IMHO rất kỳ quặc.
111 ---

1
Bạn có thể chuyển hướng đầu ra của lsmột tệp và kiểm tra nó bằng lesshoặc một trình soạn thảo văn bản ...
Laszlo Valko

1
Đối với những người vẫn còn thắc mắc, hexdump tiết lộ tên là "tftp.plist" (nghĩa là không gian kéo dài).
Joshua
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.