mv:无法统计'*.dds':没有这样的文件或目录

mv:无法统计'*.dds':没有这样的文件或目录

我使用两个简短的 bash 脚本来重命名所有目录中的所有 *.dds 文件。

第一个:

#!/bin/bash
j=39;
for i in *.dds;
do let j+=1;
mv $i 0150$j.dds;
done

第二个:

CURDIR=`pwd`
for d in $(find . -type d);
do
    cd $CURDIR/"$d"
    $CURDIR/3_rename.sh
done

我正在运行第二个并获得:

mv: cannot stat '*.dds': No such file or directory

但 *.dds 文件已正确重命名。我想了解导致该错误的我的错误。

答案1

在重命名脚本中,*.ddsglob 扩展为当前目录中以 .dds 扩展名结尾的文件名:1.dds、2.dds 等。

这里的问题是目录中没有任何以 .dds 扩展名结尾的文件,因此 glob 没有任何内容可以匹配。在这种情况下,默认行为bash是返回文字字符串“*.dds”。这会传递给mv命令,该命令会打印错误,因为不存在此类文件。

shell 选项“nullglob”可以调整此行为。启用“nullglob”后,不匹配的 glob 将消失,而不是返回文字字符串。如果参数为零,for循环将跳过空目录。

您可以在循环之前打开“nullglob”:

shopt -s nullglob
for i in *.dds;
...

更多详细信息和示例可参见此处:https://mywiki.wooledge.org/glob#nullglob。请注意警告和可移植性小节,因为它们强调了使用“nullglob”时的一些问题。

相关内容