Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 递归地将文件重命名为ASCII标准_Linux_Bash_Recursion_Mv - Fatal编程技术网

Linux 递归地将文件重命名为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') 但我似乎无法让它运行。我得到的最接近

因此,我们有一个问题,我们需要爬过成千上万的图像,并重新命名它们,以符合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:target
filename
不是目录”


有人能帮上忙吗?

把它放在一个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
我们将文件名分为dirname
d
和basename
b
。我们使用参数扩展将所有不需要的字符替换为下划线,并将扩展保存到变量
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)内