我有一台 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
。