Synology NAS 上的脚本重命名

Synology NAS 上的脚本重命名

我有一台 Synology Nas,里面有很多包含无效字符的文件(如果名称中存在此类字符,Nas 不会授予用户访问文件的权限),例如* . " / \ [ ] : ; | = ,我已设法在盒子上获取 CLI,并且想知道是否有办法更改所有共享文件夹上的文件名或使用 更改有问题的字符_。文件树结构相当深。

答案1

您可以find在此处使用命令:

find / -name "*" -exec ~/bin/some_script_that_will_rename_files.sh {} \;

并且您需要一个可以根据需要重命名文件的脚本。例如,它可能会将所有字符替换为其他字符。

问题是,这些奇怪的字符是否仅在文件名中,或者它们是否也存在于目录中。

答案2

看看你是否可以使用以下命令在其上运行 Perl:

perl -v

如果它运行,您可以安装,或者查看 Perlrename脚本是否运行,它可以非常轻松地重命名文件。示例:

touch "Freddy :;|=, Frog"                         # create file with mad name

rename --dry-run 's/[:;|=,]/_/g' *Frog            # see what it would become
'Freddy :;|=, Frog' would be renamed to 'Freddy _____ Frog'

我还做了一些其他的例子-参见这里


如果你不能使用rename,那么你可以使用类似的东西,但请在一些副本先运行几个文件,然后在运行之前进行备份。

这里我只是在 GIF 文件上进行测试,因此不会弄得一团糟。另外,我实际上什么也没做,我只是输出了我想做的事情:

find . -iname "*gif" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); echo "mv {} $new"' \;

如果看起来正确,您需要执行这个实际命令:

find . -iname "*gif" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;

这稍有不同,因为没有echo,并且我需要将参数用双引号引起来mv

答案3

非常感谢 Mark Setchell 和 mko 的帮助。我最终得到了以下命令

find . -iname "*:*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*<*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*>*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*|*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*?*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*[*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*]*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;
find . -iname "*\*" -exec bash -c 'new=$(tr ";:|" "___" <<< "{}"); mv "{}" "$new"' \;

答案4

使用以下方法发布上述内容的变体sed

   find . -iname "*:*" -exec bash -c 'new=$(sed 's/:/___/' <<< "{}"); echo "{}" "$new"' \;

这只是出于可读性的考虑,我echo在上面使用 -ing 只是为了安全。正如其他人所指出的那样,你会想要使用它mv

相关内容