mv: '*.dds' を計算できません: そのファイルまたはディレクトリがありません

mv: '*.dds' を計算できません: そのファイルまたはディレクトリがありません

私は2つの短い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

2番目のものを実行し、以下を取得します。

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

ただし、*.dds ファイルの名前は正しく変更されました。このエラーを引き起こした私のエラーを理解したいと思います。

答え1

名前変更スクリプトでは、*.ddsglobは、.dds拡張子で終わる現在のディレクトリのファイル名(1.dds、2.ddsなど)に拡張されます。

ここでの問題は、ディレクトリに.dds拡張子で終わるファイルがないため、globに一致するものがないことです。この場合のデフォルトの動作は、bashリテラル文字列「*.dds」を返すことです。これはmv対応するファイルがないため、エラーを印刷するコマンドに渡されます。

シェルオプション "nullglob" はこの動作を調整できます。 「nullglob」が有効な場合、リテラル文字列を返すのではなく、一致しないglobが消えます。引数が0の場合、forループは空のディレクトリをスキップします。

繰り返す前に「nullglob」をオンにすることができます。

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

詳細と例はここにあります。https://mywiki.wooledge.org/glob#nullglob。 「nullglob」を使用する際のいくつかの問題を強調するので、警告と移植性のサブセクションに注意してください。

関連情報