我正在寻找一种方法来查找名称中包含特定字符范围的所有文件或目录。
我想找到的字符是u0300
到u036f
范围内的 Unicode 变音符号。
如果是普通字符,我可以写-regex '[a-x]'
.使用Perl,我可以做到
find ... | perl -CS -ne 'print if ( /[x{0300}-x{036f}]/ )'
使用 GNUfind
支持的-regextypte
之一是否可以做这样的事情?我的find
报告说它将支持这些:
find -regextype help
。有效类型为"findutils-default"、"awk"、 'EGREP', 'Ed', 'Emacs', 'GNU-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed'.
更新:我真正想找到的不是带有任何重音字符的名称,而只是那些使用 NFD 形式的名称:字母后跟重音。重音字符已以 NFC 形式编码的名称(这是 Linux 和 Windows 上的默认设置(不应列出。
您可以传递 unicode 编码的正则表达式。如果使用bash
,
$ find . -regex $'.*[u0300-u036f].*'
./foo/foòbar
./foo/asd͊fgh
$'string'
语法像 C 编译器一样转换字符串。如果你不使用bash
,你的 shell 可能不会支持这种字符串文字。然后你可以求助于类似的东西
$ find . -regex $(echo -e '.*[u0300-u036f].*')
正常的 findutils-default 正则表达式类型支持这一点,在我对 findutils 4.7.0 的测试中,所有其他类型也是如此。
在字节模式下使用 gawk,如 gawk -b,或 mawk1.3.4 或 mawk1.9.9.6,
由于 U+0300码位在八进制中是 \314\200,而 U+036F 是 \315\257,我们知道它将占据 314 的所有 64 个组合,以及 315 的前 75%。然后写成
find . ( -type f -or -type d ) | {mawk/mawk2/gawk -b -e} '/314|315[200-257]/'
八进制比\x7F型notatoin更受欢迎,因为十六进制不是必需的。 八进制保证适用于 AWK 的所有 3 种变体。