0

この形式の連続した名前のファイルがたくさんあります: imageXXX.jpg. ですから、それは次のようにimage001.jpgなります。0これの数字部分を保持し、前に付けられた'sを取り除きたいだけです。代わりに、そのファイルの名前は1.jpg. Bashを使用してこれを達成するにはどうすればよいですか?

4

2 に答える 2

3

ピュアバッシュ:

shopt -s extglob
for f in image*.jpg; do mv "$f" "${f/#image*(0)}"; done

追加のコードは、名前の衝突をチェックしたり、他のエラー状態を処理したりする可能性があります。mv -iファイルが上書きされる前にプロンプ​​トを表示するために使用できます。

于 2010-09-23T05:55:40.700 に答える
2

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

サイレント障害に対応して追加

renamelikechmodは、不正な引数を与えると文句を言いますが、要求したものが効果がない場合はどちらも沈黙します。例えば

$ 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
$                  
于 2010-09-23T02:52:09.117 に答える