因此,我们遇到了一个问题,我们需要抓取成千上万个图像并将其全部重命名以符合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,因此实际上什么也没做,仅回显命令.如果看起来不错,请删除回声.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。