gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:36:25 24 4
gpt4 key购买 nike

因此我们遇到了一个问题,我们需要爬取数十万张图像并重命名所有图像以符合 ASCII 标准。在网上做了很多研究之后,我们找到了这段方便的代码:

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

来源:How to remove invalid characters from filenames

我尝试将它合并到一个递归查找命令中,在我们的主图像目录中运行:

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

但我似乎无法让它运行。我得到的最接近的是上面的代码抛出了很多“mv: target filename Is not a directory”

那么有人可以帮忙吗?

最佳答案

我想这样会更好:

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 将找到所有文件(-type f),将它们作为位置参数传递给此 Bash 片段:

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

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

我离开了 echo 这样实际上什么也没有执行,命令只是回显。如果看起来不错,请移除 echo

请注意,这会覆盖文件,例如文件 a&ba_b

关于linux - 将文件递归重命名为 ASCII 标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33055869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com