在 synology nas 上重命名文件名长度超过 143 个字符的文件

rename files with filename lengths longer than 143 characters on synology nas

我正在尝试加密 Synology Nas 上的文件夹,但发现大约 250 个文件名超过 143 个字符。有什么命令可以用来删除文件名末尾的所有字符,使其长度小于 143 个字符。

我用来查找文件的命令

find . -type f -name '???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????*' 

我希望能够导航到包含这些文件块的 8-9 左右的目录,并且能够 运行 一行代码找到名称超过 n 个字符并删除多余的字符以使其小于 143.

我不熟悉 Synology,但是如果您有一个接受 Perl 正则表达式替换的 rename 命令,并且您可以假设同一目录中没有两个文件具有相同的 143 个字符前缀(或者在这种情况下丢失其中一个是可以接受的),我猜是这样的

find . -type f -regex '.*/[^/]\{143\}[^/]+' -exec rename 's%([^/]{143})[^/]+$%%' {} +

如果您没有此版本的非标准 rename 命令,最简单的解决方案可能是将 find 的输出通过管道传输到 Perl,然后再通过管道将其传输到 sh :

find . -type f -regex '.*/[^/]\{143\}[^/]+' |
perl -pe 's%(.*/)([^/]{143})([^/]+)$%mv "" ""' |
sh

如果您无法访问 Perl,可以将相同的脚本重构为 sed 命令,尽管正则表达式会略有不同,因为它们使用不同的方言。

find . -type f -regex '.*/[^/]\{143\}[^/]+' |
sed 's%\(.*/\)\([^/]\{143\}\)\([^/]\+\)$%mv "" ""' |
sh

这对您的文件名有一些幼稚的假设 - 如果它们可以包含换行符或双引号,您需要更坚固的东西(请参阅 https://mywiki.wooledge.org/BashFAQ/020)。粗略地说,也许试试

find . -type f -regex '.*/[^/]\{143\}[^/]+' -exec bash -c 'for f; do
    g=${f##*/}
    mv -- "$f" "${f%/*}/${g:0:143}"
  done' _ {} +