Як два файли в одній з моїх папок можуть мати одне ім’я?


12

Я завантажив два файли, вони були збережені в одному імені файлу, а потім перенесли їх із scp на інший комп'ютер.

Чому вони не стали одним, коли другий був врятований?


2
Чи можете ви показати, ls -laбудь ласка, результати ?
ryekayo

2
Ще краще, ls -lb(або ls -lab, якщо назва починається з .).
G-Man каже: "Відновити Моніку"

1
Також, що, власне, сталося? Ви завантажили dir1/fooі dir2/fooна машині X, потім scpвиправили їх dir42на машині Y, і вони вийшли як окремі файли з однаковою назвою? Або ви завантажили два файли з тим самим іменем в той самий каталог (на машині X), і вони вийшли як окремі файли з тим самим іменем?
G-Man каже: «Відновіть Моніку»

Відповіді:


39

Можливо, вони виглядають лише так, як у них однакова назва.

Спробуйте:

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

Вони виглядають майже однаково.

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

Трохи краще. Символ пробілу позначено як \ (хоча це не всі lsреалізації).

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

Зараз ми говоримо (усі символи, що не належать до ASCII, відображаються як вісімкове значення їх складових байт)

Ви також можете це зробити, і це працює для будь-якого введення:

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

Тут позначено кінець рядків, $що полегшує визначення місця, що проходить. Однак це не допоможе визначити файл, який називаєтьсяSté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>

Зробити зрозумілішим, що сталося.

Дивіться також цю іншу відповідь для отримання додаткової інформації з цього питання.


1
Якщо ви не заперечуєте, щоб я запитав Стефана, що робить команда Piped LC_ALL=C sed -n 1?
ryekayo

3
sed«S lкоманда відображає вхідні в візуально однозначній формі. З LC_ALL = C ми переконуємося, що він використовує для цього лише символи ASCII (хоча принаймні з GNU sed, це не потрібно).
Стефан Шазелас

2
@ StéphaneChazelas Ви також можете використовувати:LC_ALL=C ls -b
vinc17

@ vinc17, хороший момент, це також краще, ніж sed для пошуку файлів з символами нового рядка, але не завжди для того, щоб виділити простір, що відкладається. Я додав це до відповіді.
Стефан Шазелас

Чорт, TIL, що ви можете мати пробіли в кінці імені файлу, і схоже, що у файловій системі є два файли з однаковими іменами.! Чудова відповідь, ls | LC_ALL=C sed -n lнасправді була велика економія часу, дякую!
Ілля Лінн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.