Как два файла в одной из моих папок могут иметь одинаковое имя?


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.