_と.を含む複数のファイルの名前を変更するには?

_と.を含む複数のファイルの名前を変更するには?

Linux bashシェルには、次のような複数のtifファイル(約1000個)があります。

Sep04_17.00.37.tif  Sep04_17.05.54.tif  Sep04_17.08.41.tif
Sep04_17.02.02.tif  Sep04_17.07.17.tif

名前から_と.を削除する方法は?最終結果は次のとおりです。

Sep04170037.tif  Sep04170554.tif  Sep04170841.tif
Sep04170202.tif  Sep04170717.tif

私は名前を変更しようとしました:rename 's/\_/\//' *.tif ; rename 's/\_/\//g' *.tif;そのうち何も動作しません。

答え1

あなたのアプローチは正しいです。たぶん、各ファイル名gのすべての合計に一致する正規表現の尾を見逃した可能性があります。._

で使用するには、rename次の2段階のアプローチをお勧めします。

rename 's/[._]//g' *.tif    # remove any . and _ occurence

生産する:

Sep04170037tif Sep04170202tif Sep04170554tif Sep04170717tif Sep04170841tif

それから

rename 's/tif$/.tif/' *tif    # replace ending tif by .tif

~につながる

Sep04170037.tif Sep04170202.tif Sep04170554.tif Sep04170717.tif Sep04170841.tif

躊躇しないで、オンラインで正規表現を試してみてください。正規表現 101、これはまたPCREについて多くを教えています:)


[編集]:1行を好む場合:

rename 's/[._]//g;s/tif$/.tif/' *.tif

tifまた、残念ながら、2番目のステップで終わる隣接しない関連ファイルの一致も防ぎます。

答え2

バリアントでは以下を使用しますsed

for file in *tif; do newname=$(echo "$file" | sed 's/_//;s/\.\([0-9]\)/\1/g'); mv -v "$file" "$newname"; done
'Sep04_17.00.37.tif' -> 'Sep04170037.tif'
'Sep04_17.02.02.tif' -> 'Sep04170202.tif'
'Sep04_17.05.54.tif' -> 'Sep04170554.tif'
'Sep04_17.07.17.tif' -> 'Sep04170717.tif'
'Sep04_17.08.41.tif' -> 'Sep04170841.tif'

mv -v例では、前/後を表示するためにのみ使用されています。

関連情報