查找目录中包含超过 130 个英文字符或 43 个亚洲字符的所有文件

查找目录中包含超过 130 个英文字符或 43 个亚洲字符的所有文件

我尝试在 NAS 上传输文件,但收到此错误“加密共享文件夹中的文件或文件夹名称不能超过 143 个英文字符或 47 个亚洲 (CJK) 字符”是否有命令shell 来查找每个符合该条件的文件?

答案1

find path | grep -P '\/[^\/]{130,}[^\/]$'

基于 stackoverflow.com 上的此来源: 查找对于 Synology 加密共享来说太长的文件

我在末尾添加了 $ 以仅捕获文件而不是文件夹。

也许您可以找到具有一系列 unicode 的 CJK 字符。我不认为 grep 可以做到这一点,也许乌格勒普

答案2

我认为他们试图说文件名在 UTF-8 编码时不能包含超过 143 个字符字节假设许多亚洲字符(无论它们的含义是什么)在 UTF-8 中以 3 个字节进行编码(您会注意到 48 x 3 是 144),而大多数英文字符以一个字节进行编码。

所以要找到那些:

zsh

set +o multibyte -o extendedglob
print -rC1 -- **/?(#c144,)(ND)

对于那些超出限制的人和

set +o multibyte -o extendedglob
print -rC1 -- **/?(#c1,143)(ND)

对于那些低于限制的人。

为了更容易地看到那些类型目录,您可以添加M(对于Mark)glob 限定符 ( print -rC1 -- **/?(#c144,)(NDM)),这会将 a 附加/到目录中。

或者与find

LC_ALL=C find . -name '????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????*'

对于那些超出限制的人。

上面是 144?秒;您还可以使用以下方法构建模式:

pattern=$(printf %145s '*' | tr ' ' '?')
LC_ALL=C find . ! -name "$pattern"

或者在zsh

pattern=${(l[145][?]):-*}

替换-name! -name以获取低于限制的文件名(由 143 字节或更少组成)。

通过 GNU 实现find,您还可以执行以下操作:

LC_ALL=C find . -regextype posix-extended -regex '.*/[^/]{144,}'

1 UTF-8 编码对 1 到 4 个字节的字符进行编码(最初该算法设计为在最多 6 个字节上对高达 U+7FFFFFF 的代码点进行编码,但 Unicode 代码点后来被限制为 U+10FFFF),仅US-ASCII 集(代码点 U+0000 到 U+007F)中的字符在一个字节上进行编码。 3个字节编码的是从U+0800到U+FFFF的。

相关内容