私は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
名前変更スクリプトでは、*.dds
globは、.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」を使用する際のいくつかの問題を強調するので、警告と移植性のサブセクションに注意してください。