![如何使用unix`mv`重命名带有unicode空格(而不是U+20)的文件?](https://linux22.com/image/227139/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8unix%60mv%60%E9%87%8D%E5%91%BD%E5%90%8D%E5%B8%A6%E6%9C%89unicode%E7%A9%BA%E6%A0%BC%EF%BC%88%E8%80%8C%E4%B8%8D%E6%98%AFU%2B20%EF%BC%89%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
$ 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 通常被分类为blank
或space
,所以你也可以这样做:
zmv '*' '${f//[[:blank:]]/ }'
或者:
zmv '*' '${f//[[:space:]]/ }'
替换分类为U+0020 空格blank
或space
使用 U+0020 空格的任何字符(在当前工作目录中的非隐藏文件的名称中)。
U+00A0 更罕见,因此在包括 GNU 系统在内的几个系统上,它没有被分类为这样,因为它不被用作分隔符/定界符。