
フォルダには一連のファイルがあり、ファイル名の途中に_S
(_S1
、、S2
....)で始まる文字列があり、アンダースコアで削除/交換する必要があります。S143
このように
file1_S1_R1
file2_S2_R1
file3_S95_R1
file4_S143_R1
すべき
file1_R1
file2_R1
file3_R1
file4_R1
私は標準を試しました
rename 's/_S*_/_/g' *
注文する。しかし、何も起こりませんでした。私のコンピュータでは、名前の変更にワイルドカードが機能しないようです。バックスラッシュ_
(_
とにかく予約された文字ではない)を使用してエスケープしたり、これらのトリックに違いはありません。私は何が間違っていましたか?
答え1
rename
あなたのユーティリティがPerlユーティリティであると仮定しますrename
(最初の引数としてPerl式、通常は代替式を使用します):
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file1_S1_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file2_S2_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file3_S95_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file4_S143_R1
$ rename 's/_S\d*_/_/g' *
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file1_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file2_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file3_R1
-rw-r--r-- 1 kk wheel 0 Oct 4 11:00 file4_R1
Perl正規表現の代わりにファイル名globbingパターンを使用して正規表現エラーが発生すると仮定できます。S*
(0個以上のS
文字一致)をS\d*
(S
次に0個以上の数値一致)に変更して問題を解決しました。