如何使用unix`mv`重命名带有unicode空格(而不是U+20)的文件?

如何使用unix`mv`重命名带有unicode空格(而不是U+20)的文件?
$ ls cn*
cn blah blah.txt
$ ls cn\ *
ls: cannot access 'cn *': No such file or directory
$ ls cn*|hexdump -C
00000000  63 6e e2 80 85 62 6c 61  68 c2 a0 62 6c 61 68 2e  |cn...blah..blah.|
00000010  74 78 74 0a                                       |txt.|
$ mv cn blah blah.txt 'cn blah blah.txt'
mv: 'cn blah blah.txt' and 'cn blah blah.txt' are the same file

注意:0xe28085 是 U+2005(FOUR-PER-EM SPACE) 的 UTF-8 编码,0xC2A0 是 U+A0(NO-BREAK SPACE) 的 UTF-8 编码,我将第一个参数复制粘贴mv到也就是为什么'文件名周围不需要 s,因为有文件名中的普通空格(U+20)。

如何重命名文件以便可以用常规空格(即 U+20)键入文件名?

答案1

zsh

autoload zmv
zmv '*' $'${f//[\u2005\ua0]/ }'

U+2005 通常被分类为blankspace,所以你也可以这样做:

zmv '*' '${f//[[:blank:]]/ }'

或者:

zmv '*' '${f//[[:space:]]/ }'

替换分类为U+0020 空格blankspace使用 U+0020 空格的任何字符(在当前工作目录中的非隐藏文件的名称中)。

U+00A0 更罕见,因此在包括 GNU 系统在内的几个系统上,它没有被分类为这样,因为它不被用作分隔符/定界符。

相关内容