Jak dwa pliki w jednym z moich folderów mogą mieć tę samą nazwę?


12

Pobrałem dwa pliki, oba zostały zapisane pod tą samą nazwą pliku, a następnie przeniosłem je za pomocą SCP na inny komputer.

Dlaczego nie stali się jednym, gdy drugie zostało uratowane?


2
Czy możesz pokazać wyniki ls -la?
— ryekayo

2
Jeszcze lepiej ls -lb(lub ls -lab, jeśli nazwa zaczyna się od .).
— G-Man mówi „Przywróć Monikę”

1
Co dokładnie się stało? Pobrałeś dir1/fooi dir2/foona maszynie X, a następnie scpedytujesz je dir42na maszynie Y, a wyszły jako osobne pliki o tej samej nazwie? A może pobrałeś dwa pliki o tej samej nazwie do tego samego katalogu (na komputerze X) i wyszły jako osobne pliki o tej samej nazwie?
— G-Man mówi „Przywróć Monikę”

Odpowiedzi:


39

Może tylko wyglądają, jakby miały to samo imię.

Próbować:

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

Wyglądają prawie tak samo.

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

Trochę lepiej. Znak spacji jest oznaczony jako \ (chociaż nie wszystkie lsimplementacje to robią).

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

Teraz rozmawiamy (wszystkie znaki spoza ASCII są renderowane jako ósemkowa wartość ich bajtów)

Możesz także zrobić, a to działa na każdym wejściu:

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

Tutaj koniec linii jest oznaczony, $co ułatwia dostrzeżenie końcowego odstępu. Nie pomoże to jednak w wykryciu pliku o nazwieSté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>

Wyjaśnia, co się stało.

Zobacz także inną odpowiedź, aby uzyskać więcej informacji na ten temat.


1
Jeśli nie masz nic przeciwko, żebym zapytał Stephane'a, co robi polecenie potokowe LC_ALL=C sed -n 1?
— ryekayo

3
sed„s lpolecenie wyświetla sygnał wejściowy w postaci optycznie jednoznaczny. Dzięki LC_ALL = C upewniamy się, że używa do tego tylko znaków ASCII (chociaż przynajmniej w GNU sednie jest to konieczne).
— Stéphane Chazelas,

2
@ StéphaneChazelas Możesz także użyć:LC_ALL=C ls -b
— vinc17

@ vinc17, dobra uwaga, to także lepiej niż sed, aby dostrzec pliki ze znakami nowego wiersza, ale nie zawsze dostrzec końcowe miejsce. Dodałem to do odpowiedzi.
— Stéphane Chazelas

Cholera, TIL, że możesz mieć spacje na końcu nazwy pliku i wygląda na to, że są dwa identyczne nazwy plików w systemie plików.! Świetna odpowiedź, ls | LC_ALL=C sed -n lnaprawdę było teraz dużą oszczędnością czasu, dzięki!
— Elijah Lynn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.