Làm thế nào hai tệp trong một trong các thư mục của tôi có cùng tên?


12

Tôi đã tải xuống hai tệp, cả hai đều được lưu vào cùng một tên tệp và sau đó tôi chuyển chúng bằng scp sang máy tính khác.

Tại sao họ không trở thành một khi thứ hai được cứu?


2
Bạn có thể hiển thị kết quả của ls -laxin vui lòng?
ryekayo

2
Tốt hơn nữa, ls -lb(hoặc ls -lab, nếu tên bắt đầu bằng .).
G-Man nói 'Phục hồi Monica'

1
Ngoài ra, những gì, chính xác, đã xảy ra? Bạn đã tải xuống dir1/foodir2/footrên máy X, sau đó scp'chỉnh sửa chúng dir42trên máy Y và chúng xuất hiện dưới dạng các tệp riêng biệt có cùng tên? Hoặc bạn đã tải xuống hai tệp có cùng tên vào cùng một thư mục (trên máy X) và chúng xuất hiện dưới dạng các tệp riêng biệt có cùng tên?
G-Man nói 'Phục hồi Monica'

Câu trả lời:


39

Có lẽ họ chỉ trông giống như họ có cùng tên.

Thử:

$ touch Stéphane Stéphane Stéphane\  St​éphane
$ ls -1
Stéphane
Stéphane
St​éphane
Stéphane 

Họ trông khá giống nhau.

$ ls -1b
Stéphane
Stéphane
St​éphane
Stéphane\ 

Tốt hơn một chút. Ký tự khoảng trắng được gắn cờ là \ (mặc dù không phải tất cả các lscài đặt đều làm điều đó).

$ LC_ALL=C ls -1b
Ste\314\201phane
St\303\251phane
St\303\251phane\ 
St\342\200\213\303\251phane

Bây giờ chúng ta đang nói (tất cả các ký tự không phải ASCII được hiển thị dưới dạng giá trị bát phân của các thành phần byte của chúng)

Bạn cũng có thể làm và điều đó hoạt động cho bất kỳ đầu vào nào:

$ ls | LC_ALL=C sed -n l
Ste\314\201phane$
St\303\251phane$
St\342\200\213\303\251phane$
St\303\251phane $

Ở đây, phần cuối của dòng được đánh dấu $giúp dễ dàng phát hiện ra dấu cách. Tuy nhiên, điều đó sẽ không giúp phát hiện ra một tệp có tênStéphane<newline>Stéphane

$ ls | perl -Mopen=locale -MUnicode::UCD=charinfo -lpe '
       s/[^\41-\177]/"<".charinfo(ord$&)->{name}.">"/ge'
Ste<COMBINING ACUTE ACCENT>phane
St<LATIN SMALL LETTER E WITH ACUTE>phane
St<ZERO WIDTH SPACE><LATIN SMALL LETTER E WITH ACUTE>phane
St<LATIN SMALL LETTER E WITH ACUTE>phane<SPACE>

Làm cho nó rõ ràng hơn những gì đã xảy ra.

Xem thêm câu trả lời khác này để biết thêm về chủ đề này.


1
Nếu bạn không phiền tôi hỏi Stephane, lệnh piped LC_ALL=C sed -n 1làm gì?
ryekayo

3
sed's llệnh hiển thị đầu vào ở dạng rõ ràng bằng mắt thường. Với LC_ALL = C, chúng tôi đảm bảo rằng nó chỉ sử dụng các ký tự ASCII cho điều đó (mặc dù ít nhất là với GNU sed, điều đó là không cần thiết).
Stéphane Chazelas

2
@ StéphaneChazelas Bạn cũng có thể sử dụng:LC_ALL=C ls -b
vinc17

@ vinc17, điểm tốt, điều đó cũng tốt hơn so với sed để phát hiện các tệp có ký tự dòng mới, nhưng không phải lúc nào cũng phát hiện ra dấu cách. Tôi đã thêm nó vào câu trả lời.
Stéphane Chazelas

Chết tiệt, TIL rằng bạn có thể có khoảng trắng ở cuối tên tệp và có vẻ như có hai tệp tên giống hệt nhau trên hệ thống tệp.! Câu trả lời tuyệt vời, ls | LC_ALL=C sed -n lthực sự là một tiết kiệm thời gian lớn vừa rồi, cảm ơn!
Elijah Lynn
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.