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?

coś tam coś tam
źródło
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.

Stéphane Chazelas
źródło
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