フォルダには32個の* .ddsファイルがあります。
pic-0.dds, pic-1.dds, pic-2.dds,...,pic-31.dds
名前を次のように変更したいと思います。
015040.dds, 015041.dds, 015042.dds,...,0150471.dds.
次のスクリプトを使用しようとしています。
#!/bin/bash
j=39;
for i in *.dds;
do let j+=1;
mv $i 0150$j.dds;
done
pic-0.dds
名前がに変更されましたが、エラー015040.dds
が発生しました。つまり、名前が等pic-1.dds
に変わりませんでした。015041.dds
次のような他の名前を変更するための共通スクリプトが必要です。
pic-40.dds, pic-41.dds, pic-42.dds,...,pic-53.dds
到着する:
0191.dds, 0192.dds, 0193.dds,...,0204.dds
答え1
問題は、pic-*.dds
ダッシュの後の数字ではなく文字順にファイルを並べ替えることです。
0
この問題を解決する1つの可能な方法は、ファイル名の後にダッシュを挿入することですpic-{0..9}.dds
。その後、ファイルをアルファベット順にリストすることは、数値順にソートするのと同じで、すべてがうまく機能します。
すでに使用したものと同様のループを使用してこれを実行できます。
for f in pic-?.dds ; do
mv "$f" pic-0"${f#pic-}"
done
${f#pic-}
これはパラメータの置換#
、このシンボルは、変数$ fの値の先頭から文字列を削除するようにシェルに指示します。pic-
答え2
シェルfor
ループは不要で、rename
Perlを使用して実行できます。
Perlユーティリティは、ディストリビューションに応じて、、またはともrename
呼ばれます。機能とコマンドラインオプションが完全に異なり、互換性のないユーティリティと混同しないでください。 Perlを使用すると、ランダムに複雑なPerlコードを使用してファイルの名前を変更できますが、ファイル名に対して単純で類似した操作を実行するために最も一般的に使用されます。file-rename
perl-rename
prename
rename
util-linux
rename
sed
s/search/replace/
たとえば、
$ rename -n 's/pic-(\d+)\.dds$/sprintf("015%03i.dds",$1+40)/e' *.dds
rename(pic-0.dds, 015040.dds)
rename(pic-10.dds, 015050.dds)
rename(pic-11.dds, 015051.dds)
rename(pic-12.dds, 015052.dds)
rename(pic-13.dds, 015053.dds)
rename(pic-14.dds, 015054.dds)
rename(pic-15.dds, 015055.dds)
rename(pic-16.dds, 015056.dds)
rename(pic-17.dds, 015057.dds)
rename(pic-18.dds, 015058.dds)
rename(pic-19.dds, 015059.dds)
rename(pic-1.dds, 015041.dds)
rename(pic-20.dds, 015060.dds)
rename(pic-21.dds, 015061.dds)
rename(pic-22.dds, 015062.dds)
rename(pic-23.dds, 015063.dds)
rename(pic-24.dds, 015064.dds)
rename(pic-25.dds, 015065.dds)
rename(pic-26.dds, 015066.dds)
rename(pic-27.dds, 015067.dds)
rename(pic-28.dds, 015068.dds)
rename(pic-29.dds, 015069.dds)
rename(pic-2.dds, 015042.dds)
rename(pic-30.dds, 015070.dds)
rename(pic-31.dds, 015071.dds)
rename(pic-3.dds, 015043.dds)
rename(pic-4.dds, 015044.dds)
rename(pic-5.dds, 015045.dds)
rename(pic-6.dds, 015046.dds)
rename(pic-7.dds, 015047.dds)
rename(pic-8.dds, 015048.dds)
rename(pic-9.dds, 015049.dds)
次に、ファイル名の数をキャプチャし、pic-*.dds
40に追加して最終ファイル名を作成します。置換操作では、s/search/replace/
Perl/e
修飾子を使用してPerlコードに右置換を実行します。このsprintf
関数は、計算形式が3ビット幅のゼロパディング文字列(%03i
)であることを保証します。
- これは、ファイル名が表示される順序に関係なく機能します。増分カウンタを使用せずに
pic-(\d+).dds$
ファイル名から既存の数字を取得し、40を追加します。 - パターンと一致しないファイル名は変更されません。
- perl renameは既存のファイル名を上書きしません(
-f
このオプションを使用して強制しない限り)。
上記の例のオプションを使用すると、-n
練習を実行できます。展示する実際にファイル名を変更せずに実行する操作です。要件を満たしていることが確認されたら、削除するか、-n
詳細な出力に置き換えます。-v