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
例では、前/後を表示するためにのみ使用されています。