Shell 脚本可以修复错误的文件名吗?

Shell 脚本可以修复错误的文件名吗?

我在我的小公司里做 IT 工作;尽管我发出了严厉的警告,但每个人都在服务器上放置了名称可怕的文件,包括前导和尾随空格、坏字符(包括\ ; / + . < > -等等!)

他们通过 Mac 上的 AFP 访问(FreeBSD/FreeNAS)服务器来实现这一点,因此系统的任何部分都不会抱怨。

是否有一个脚本可以用来遍历整个目录树并修复错误的文件名?

基本上用 ... 替换所有空格和错误的 ASCII _,如果文件已经存在,则只需_2在末尾加上 a 或其他内容。

我不认为有办法让系统执行有好的文件命名约定吗?

答案1

find / -iname您可以使用模式匹配您不想看到的内容来获取它们的列表(考虑使用正则表达式,如[^:alnum:])。您可以将其操作(例如使用 sed)到将使用 mv 重命名文件的 shell 脚本中。

可接受的文件名由文件系统决定,因此可能有或可能没有不使用 cronjob 的方法来强制执行它。

答案2

@terdon 在超级用户那里提供了一个优雅的一行解决方案:

SAVEIFS=$IFS; IFS=$(echo -en "\n\b"); \
for i in $(find . -type f  -name "*[\:\;\>\<\@\$\#\&\(\)\?\\\%\ ]*"); \
do mv "$i" ${i//[\;><\@\$\#\&\(\)\?\\\%\ ]/_}; done; IFS=$SAVEIFS

(为清晰起见添加了换行符;全部为一行。)

或者,你可以更积极地使用类似

for i in $(find . -type f  -name "*[^0-9A-Za-z\_\.\-]*"); 

完整详情请点击这里:https://superuser.com/questions/463742/shell-script-to-fix-bad-filenames

相关内容