この形式の連続した名前のファイルがたくさんあります: imageXXX.jpg
. ですから、それは次のようにimage001.jpg
なります。0
これの数字部分を保持し、前に付けられた'sを取り除きたいだけです。代わりに、そのファイルの名前は1.jpg
. Bashを使用してこれを達成するにはどうすればよいですか?
2 に答える
ピュアバッシュ:
shopt -s extglob
for f in image*.jpg; do mv "$f" "${f/#image*(0)}"; done
追加のコードは、名前の衝突をチェックしたり、他のエラー状態を処理したりする可能性があります。mv -i
ファイルが上書きされる前にプロンプトを表示するために使用できます。
Linux では、由緒ある Perl ユーティリティのrenameが使いやすいです。
$ rename 's/^image0+//' image*.jpg
先頭のゼロを削除すると、並べ替え順序が台無しになることに注意してください。つまり、次の*.jpg
ような順序です。
1.jpg
10.jpg
11.jpg
...
2.jpg
20.jpg
順序を維持したい場合は、使用してください
$ rename 's/^image//' image*.jpg
代わりは。
システム識別に応じて追加
おそらく bash だけでスクリプトを作成できますが、それは自明ではなく、失敗のケースを正しく処理する必要があります。ええ、Perl をシステムに巻き上げるのも簡単ではありませんが、それは簡単で、車輪はすでに発明されています。
Fedora Core 8 Perl RPM: http://rpm.pbone.net/index.php3/stat/4/idpl/5152898/dir/fedora_8/com/perl-5.8.8-30.n0i.51.fc8.i386。 rpm.html
CPAN の名前変更: http://metacpan.org/pod/File::Rename
サイレント障害に対応して追加
rename
likechmod
は、不正な引数を与えると文句を言いますが、要求したものが効果がない場合はどちらも沈黙します。例えば
$ ls -l junk
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 junk
$ chmod 688 junk
chmod: invalid mode: '688'
$ chmod 644 junk # was already 644 mode, nothing happened no error
$ rename 's/bob/alice/' ju*k
# there was no 'bob' in 'junk' to substitute, no change, no error
$ ls -l junk
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 junk
$ rename 's/un/ac/' j*k # but there is an 'un' in 'junk', change it
$ ls -l j*k
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 jack
rename
サイレントにすることができます:
$ rename --verbose 's/ac/er/' j*k
jack renamed as jerk
$ rename --verbose 's/ac/er/' j*k # nothing to rename
$