私のディレクトリをバックアップすると、名前にę、ą、ż、źなどのポーランド語文字を含むディレクトリが「重複」しました。
これにより、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 つの記号 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