`<0328>`과 같은 4개의 유니코드 기호 문자가 포함된 디렉토리를 찾는 방법

`<0328>`과 같은 4개의 유니코드 기호 문자가 포함된 디렉토리를 찾는 방법

내 디렉토리를 백업할 때 이름에 ę, ą, ż, ź 등과 같은 폴란드어 문자가 포함된 디렉토리가 "중복"되었습니다.

이렇게 하면 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그러나 디렉토리(예: 또는 ) 로 작업을 시도하면 mvzsh는 디렉토리를 다르게 자동 완성합니다.

  1. 올바르게 인코딩된 "ę" 옵션:ls 050805\ -\ PKP\ Międzyzdroje/

  2. 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

관련 정보