「<0328>」のような4つのUnicodeシンボル文字を含むディレクトリを見つける方法

「<0328>」のような4つのUnicodeシンボル文字を含むディレクトリを見つける方法

私のディレクトリをバックアップすると、名前にę、ą、ż、źなどのポーランド語文字を含むディレクトリが「重複」しました。

これにより、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 つの記号 Unicode 文字 "<0328>" を含むオプション:ls 050805\ -\ PKP\ Mie<0328>dzyzdroje/

質問:これらの4つの記号Unicode文字を含むすべてのディレクトリを見つけて、名前をいくつかのASCII名に変更し、重複を削除するにはどうすればよいですか?

FWIW、私のホストはDebianにありますが、問題を引き起こすSambaを介してmacOSクライアントを使用している可能性があります。

答え1

ęあらかじめ結合された形式(OGONEKを含むU + 0119ラテン小文字E)の一部のファイルと、分解された形式のファイルが1つあり、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

(Debianパッケージに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

関連情報