![다른 INODES를 가진 동일한 파일 이름](https://linux55.com/image/12429/%EB%8B%A4%EB%A5%B8%20INODES%EB%A5%BC%20%EA%B0%80%EC%A7%84%20%EB%8F%99%EC%9D%BC%ED%95%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84.png)
최근 RHEL6이 설치된 시스템에서 다음을 발견했습니다.
ls -lbi
917921 -rw-r-----. 1 alex pivotal 5245 Dec 17 20:36 application.yml
917922 -rw-r-----. 1 alex pivotal 2972 Dec 17 20:36 application11.yml
917939 -rw-r-----. 1 alex pivotal 3047 Dec 17 20:36 application11.yml
917932 -rw-r-----. 1 alex pivotal 2197 Dec 17 20:36 applicationall.yml
이런 것을 어떻게 구현하는지 궁금합니다.
답변1
이 동작을 재현할 수 있습니다. 예를 참조하세요:
ls -lib
268947 -rw-r--r-- 1 root root 8 Dez 20 12:32 app
268944 -rw-r--r-- 1 root root 24 Dez 20 12:33 aрр
이것은 내 시스템에 있습니다( Linux debian 4.9.0-7-amd64 #1 SMP Debian 4.9.110-3+deb9u2 (2018-08-13) x86_64 GNU/Linux
).
UTF-8 로캘이 있고 위 출력의 문자는 p
다르지만 비슷해 보입니다. 첫 번째 줄은 a LATIN SMALL LETTER P
이고 두 번째 줄은 a입니다 CYRILLIC SMALL LETTER ER
(참조:https://unicode.org/cldr/utility/confusables.jsp?a=p&r=None). 이는 단지 예일 뿐이며 파일 이름의 모든 문자, 심지어 점까지 가능합니다.
UTF-8 로케일을 사용하면 쉘에서 위의 출력을 제공합니다. 그러나 기본 locale 과 같이 모든 유니코드 문자를 포함하지 않는 로케일을 사용하면 c
출력은 다음과 같습니다(설정을 통해 로케일을 변경할 수 있음 LC_ALL
).
LC_ALL=c ls -lib
268947 -rw-r--r-- 1 root root 8 Dec 20 12:32 app
268944 -rw-r--r-- 1 root root 24 Dec 20 12:33 a\321\200\321\200
CYRILLIC SMALL LETTER ER
이는 ASCII에 존재하지 않기 때문입니다 .
답변2
방금 같은 문제가 발생했습니다. 두 파일 모두 서로 다른 inode를 가지고 있지만 이름은 분명히 같습니다(프랑스어로). Chaos의 뛰어난 답변을 통해 두 번째 파일 이름의 두 문자 é가 첫 번째 파일의 이름과 다르다는 사실이 분명해졌습니다. 다음 파일에는 동일한 inode가 없습니다.
나 @우분투:~$ ls -li 2020\ 06\ 03\ CR\ R*
9586921 -rw-rw-r-- 1 francis francis 107933 jun 4 18:53 '2020 06 03 CR Réunion équipe.docx'
9569690 -rw-rw-r- - 1 francis francis 107933 6월 4일 17:11 '2020 06 03 CR Reunion Island.docx'
그리고 그들은 정확히 같은 이름을 가지고 있지 않습니다:
나 @우분투:~$ LC_ALL=c ls 2020\ 06\ 03\ CR\ R*
bash: 경고: setlocale: LC_ALL: 로캘을 변경할 수 없습니다. (c)
'2020 06 03 CR Re'$'\314\201''union e'$' \ 314\201''quipe.docx' '2020 06 03 CR R'$'\303\251''유나이티드'$'\303\251''quipe.docx'
그리고 그 내용은 동일합니다:
나 @우분투:~$ cmp '2020 06 03 CR 레위니옹섬.docx' '2020 06 03 CR 레위니옹섬.docx'
설명에 따르면 두 번째 파일 이름에서 é는 UTF8 LATIN SMALL LETTER E AND ACUTE(C3 A9)이고 첫 번째 LATIN SMALL LETTER E + COMBINING ACUTE ACCENT(65 CC 81)입니다.
LATIN SMALL LETTER E + COMBINING ACUTE ACCENT를 웹 양식에 붙여넣으면 LATIN SMALL LETTER E AND ACUTE로 변환됩니다.