Find
使用 find -exec 呼叫文件名字元編碼時會混淆
我想簡化這個例子,但是任何進一步的簡化都會消除這個問題……我已經把我的腳本簡化為:
#!/bin/sh echo "$1" | sed 's/[^[:alnum:]]//g'
這會在直接呼叫時完成我期望它做的事情,但不是作為 a 的一部分
find -exec
:$ cp "Motörhead "{1,2} $ ./foo.sh M*1 Motörhead1 $ ./foo.sh M*2 Motörhead2 $ find . -name "M*" -exec ./foo.sh {} \; Motorhead1 Motörhead2
直接呼叫時一切都很好,但作為
-exec
命令的一部分,變音符號會被搞砸,至少有時是這樣。區別?Motörhead 1
由finder創建,而Motörhead 2
由shell創建。這就像find
檢測查找器創建的文件名的字元編碼有問題。
- 如果我用 替換第二個腳本行
name="Motörhead"
,問題就消失了- 可在文件系統和
apfs
掛載上重現exfat``afp
- 我在帶有 zsh 的 Terminal.app 中的 MacOS Catalina 上
locale
是de_DE.UTF-8
我讀過 MacOS X 將
ö
, 等字元儲存為組合/組合字元。也就是兩個字元:o
, 後跟"
. 可能這不適用於 Unix 層。我可以在 Debian Gnu/Linux 上重現:
echo Åström | sed 's/[^[:alnum:]]//g'
- 轉到https://en.wikipedia.org/wiki/Precomposed_character#Comparing_precomposed_and_decomposed_characters並粘貼Åström
. 使用組合字元的那個會去掉重音。就好像
sed
看到組合字元就好像它們只是非字母數字字元一樣。解決方法
作為一種解決方法,通過管道傳輸文件名
iconv -f utf-8-mac -t utf-8
檢查文本
od
在 Debian Gnu/Linux 上完成,使用 Konsole 終端和 bash shell、plasma-desktop,並從 chrome 瀏覽器粘貼。
#↳ echo Åström composing | od -tax1 0000000 A L nl s t r o L bs m sp c o m p o 41 cc 8a 73 74 72 6f cc 88 6d 20 63 6f 6d 70 6f 0000020 s i n g nl 73 69 6e 67 0a 0000025 #↳ echo Åström composed | od -tax1 0000000 C enq s t r C 6 m sp c o m p o s e c3 85 73 74 72 c3 b6 6d 20 63 6f 6d 70 6f 73 65 0000020 d nl 64 0a 0000022