我尝试在 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
(对于M
ark)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的。