Linux 递归地将文件重命名为ASCII标准
因此,我们有一个问题,我们需要爬过成千上万的图像,并重新命名它们,以符合ASCII标准。在网上做了大量研究后,我们发现了这段方便的代码:Linux 递归地将文件重命名为ASCII标准,linux,bash,recursion,mv,Linux,Bash,Recursion,Mv,因此,我们有一个问题,我们需要爬过成千上万的图像,并重新命名它们,以符合ASCII标准。在网上做了大量研究后,我们发现了这段方便的代码: mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g') 来源: 我已尝试将其合并为递归查找命令,以便在主图像目录中运行: find . -print0 | xargs -0 mv $(echo | sed -e 's/[^A-Za-z0-9._-]/_/g') 但我似乎无法让它运行。我得到的最接近
mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')
来源:
我已尝试将其合并为递归查找命令,以便在主图像目录中运行:
find . -print0 | xargs -0 mv $(echo | sed -e 's/[^A-Za-z0-9._-]/_/g')
但我似乎无法让它运行。我得到的最接近的结果是,上面的代码抛出了很多“mv:targetfilename
不是目录”
有人能帮上忙吗?把它放在一个shell脚本中,比如fixname.sh:
#!/bin/sh
dir=$(dirname "$1")
name=$(basename "$1")
newname=$(echo "$name" | sed -e 's/[^A-Za-z0-9._-]/_/g')
if [ "$name" != "$newname" ]; then
if [ ! -e "$newname" ]; then
mv "$1" "$dir/$newname"
else
echo >&2 "$newname already exist for $1"
fi
fi
然后使用find like so:
find . -type f -exec sh fixname.sh {} \;
我想这样会更好:
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
我们将文件名分为dirnamed
和basenameb
。我们使用参数扩展将所有不需要的字符替换为下划线,并将扩展保存到变量nb
。我们检查扩展名$b
和$nb
是否不同(以避免mv
出错),如果不同,则执行重命名
我离开了echo,因此实际上没有执行任何操作,只回显命令。如果回声看上去不错,请将其移除
请注意,这可能会覆盖文件,例如文件
a&b
和a\u b
您确定这完全有效吗?脚本在300+K的图像上运行大概需要3秒钟。。还应该指出的是,当前目录中没有图像,它只包含许多子文件夹,而这些子文件夹反过来又包含images@amartin:我唯一能想到的是语言环境问题(您的字符范围a-Za-z
可以包括é
之类的字符)。尝试在find命令前添加LC_ALL=C
。否则,如果您能够精确定位未重命名的特定文件名,那将非常有趣。预加LC_ALL=C似乎可以修复所有命名错误!!只需几秒钟就可以遍历数十万张图像…闪电般的解决方案。。谢谢你的回答!由于某种原因,它没有工作-它运行了,但是python仍然抛出:“ascii”编解码器无法对位于位置80的字节0xc3进行解码:序号不在我操作的图像的范围(128)内