ファイル名を変更して4文字目と6文字目の後にダッシュを追加する

ファイル名を変更して4文字目と6文字目の後にダッシュを追加する

次のようなファイルがあります:

20150716_something-here
20150716_something-heretoo
20150716_something-hereaswell

次のように名前を変更する必要があります

2015-07-16_something-here
2015-07-16_something-heretoo
2015-07-16_something-hereaswell

私はperl実装rename指示(受け入れられた回答に対する私のコメントを参照してください) しかし、私は成功しませんでした。

答え1

bash の組み込み部分文字列拡張を使用する:

for f in 2015* ; do
  mv "$f" "${f::4}-${f:4:2}-${f:6}"
done

答え2

sed

LC_ALL=C sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/' <file

答え3

renameは非常に強力なツールですが、私は通常、mmv(複数移動)ユーティリティ:

mmv '????????_*' '#1#2#3#4-#5#6-#7#8_#9'

検索パターン内のは?1 つの文字を表し、 は*任意の長さの文字列を表します。置換パターンでは、各 は検索パターン内#<number>の対応する?または を表します。および*に加えて、は括弧内の文字範囲 ( など) をサポートします。?*mmv[a-f]

(mmv作業を開始する前に名前の変更で競合がないかテストするため、上書きによってファイルが失われるリスクはありません。)

答え4

私のディストリビューションにはperl-rename、Perl スタイルの正規表現を使用してファイルを一括で名前変更できるコマンドがあります。このrenameコマンドは、名前変更に固定文字列のペアのみを受け入れます。

関連情報