내 디렉토리를 백업할 때 이름에 ę, ą, ż, ź 등과 같은 폴란드어 문자가 포함된 디렉토리가 "중복"되었습니다.
이렇게 하면 ls -al
다음과 같은 응답을 받습니다.
drwxrwxr-x+ 310 root users 313 Oct 9 16:18 .
drwxrwxr-x+ 13 root users 14 Dec 1 2019 ..
drwxrwxr-x+ 2 root users 83 May 16 2021 '050805 - PKP Międzyzdroje'
drwxrwxr-x+ 2 root users 83 Nov 8 2019 '050805 - PKP Międzyzdroje'
ls
그러나 디렉토리(예: 또는 ) 로 작업을 시도하면 mv
zsh는 디렉토리를 다르게 자동 완성합니다.
올바르게 인코딩된 "ę" 옵션:
ls 050805\ -\ PKP\ Międzyzdroje/
4개 기호 유니코드 문자 "<0328>"가 포함된 옵션:
ls 050805\ -\ PKP\ Mie<0328>dzyzdroje/
질문: 이러한 4개 기호 유니코드 문자가 포함된 모든 디렉터리를 찾아서 이름을 일부 ASCII 이름으로 바꾼 다음 중복을 제거하려면 어떻게 해야 합니까?
FWIW, 내 호스트는 Debian에 있지만 문제를 일으키는 Samba를 통해 macOS 클라이언트를 사용하고 있을 수 있습니다.
답변1
ę
미리 결합된 형식(OGONEK이 포함된 U+0119 라틴 소문자 E)의 일부 파일과 분해된 형식의 파일 하나가 있고 e
그 뒤에 U+0328 COMBINING OGONEK이 있습니다.
macOS는 파일 이름의 텍스트를 분해된 형식으로 변환하여 온갖 문제를 일으키는 것으로 알려져 있습니다.
U+0328 문자가 포함된 파일 이름을 찾으려면 다음을 사용하십시오 zsh
.
ls -ld -- **/*$'\u328'*(D)
또는 임의의 조합으로 표시된 항목을 찾으십시오.
set -o rematchpcre
ls -ld -- **/*(De['[[ $REPLY:t =~ "\pM" ]]'])
또는 도우미 함수를 정의합니다.
hasMarks() {
set -o localoptions -o rematchpcre
[[ $REPLY:t =~ '\pM' ]]
}
ls -ld -- **/*(D+hasMarks)
분해에서 사전 조립으로 변환하려면 POSIX와 유사한 셸에서 파일 이름이 개행 문자로 끝나지 않는다고 가정합니다.
precomposed=$(printf '%s\n' "$decomposed" | uconv -x nfc)
아니면 zsh
다음과 같은 가정을 하지 마세요.
printf -rN - $decomposed | uconv -x nfc | IFS= read -rd '' precomposed
( 데비안 패키지에 uconv
있음 icu-devtools
)
이름을 바꾸려면 다음으로 이동하세요 zsh
.
set -o rematchpcre -o pipefail
for file (**/*(NDode['[[ $REPLY:t =~ "\pM" ]]']))
print -rN - $file:t | uconv -x nfc | IFS= read -rd '' new &&
mv -Tvi -- $file $file:h/$new