Find

使用 find -exec 呼叫文件名字元編碼時會混淆

  • March 21, 2020

我想簡化這個例子,但是任何進一步的簡化都會消除這個問題……我已經把我的腳本簡化為:

#!/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 上
  • localede_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

引用自:https://unix.stackexchange.com/questions/573982