微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux-将文件递归重命名为ASCII标准

因此,我们遇到了一个问题,我们需要抓取成千上万个图像并将其全部重命名以符合ASCII标准.在网上进行了大量研究之后,我们发现了以下方便的代码

mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')

来源:How to remove invalid characters from filenames

我尝试将其合并到递归的find命令中,以便在我们的主图像目录中运行:

find . -print0 | xargs -0 mv $(echo | sed -e 's/[^A-Za-z0-9._-]/_/g')

但是我似乎无法运行它.我得到的最接近的是上面的代码,抛出了很多“ MV:目标文件名不是目录”

那么有人可以帮忙吗?

解决方法:

我想这样会更好:

find . -type f -exec bash -c 'for f do d=${f%/*} b=${f##*/} nb=${b//[^A-Za-z0-9._-]/_}; [[ $b = "$nb" ]] || echo mv "$f" "$d/$nb"; done' _ {} +

find将找到所有文件(类型f),并将它们作为位置参数传递给此Bash代码段:

for f do
    d=${f%/*} b=${f##*/} nb=${b//[^A-Za-z0-9._-]/_}
    [[ $b = "$nb" ]] || echo mv "$f" "$d/$nb"
done

我们将文件名分为dirname d和basename b.我们使用参数扩展将所有不需要的字符替换为下划线,并将该扩展保存到变量nb中.我们检查扩展$b和$nb是否不同(以避免mv错误),如果它们不同,则执行重命名.

我离开了echo,因此实际上什么也没做,仅回显命令.如果看起来不错,请删除回声.

请注意,这会覆盖文件,例如文件a& b和a_b.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐