gitで複数のファイルを一括で移動またはリネームする方法を教えてください


gitリポジトリ内の全erbファイルをhamlにリネームしたいです。（例: index.html.erb => index.html.haml）

以下のようなコマンドで一つずつリネームするのは大変です。

[code]

    $ git mv app/views/pages/index.html.erb app/views/pages/index.html.haml
    
[/code]

また、こんなコマンドが使えるかなと思ったのですが、無理でした。

[code]

    $ git mv app/views/**/*.erb app/views/**/*.haml
    
    usage: git mv [options] <source>... <destination>
    
        -n, --dry-run         dry run
        -f, --force           force move/rename even if target exists
        -k                    skip move/rename errors
    
[/code]

こういう場合はどうすればよいでしょうか？




質問者と同じく[英語版サイトの解答](https://stackoverflow.com/a/9151943/4037)を入れると

[code]

    for i in $(find . -iname "*.erb"); do
        git mv "$i" "$(echo $i | rev | cut -d '.' -f 2- | rev).haml";
    done
    
[/code]

ですが、これだけだと価値を足していないので、解説してみます。

[code]

    $(find . -iname "*.erb")
    
[/code]

で、`.erb` で終わるファイルをすべてリストアップします。それを `for` で1つずつ見ていきます。

次に

[code]

    $(echo $i | rev | cut -d '.' -f 2- | rev)
    
[/code]

を見ていきます。

[code]

    echo $i | rev
    
[/code]

でファイルへのパスを逆向きにします（例：`app/views/person/index.html.erb` ->
`bre.xedni/nosrep/sweiv/ppa`）。

[code]

    cut -d '.' -f 2-
    
[/code]

で、ファイルをドット `.` で区切り、2番目以降だけ取り出します（つまり、`bre.` だけ消す）。

最後に `rev` で文字を元の正方向に戻します。（例：`xedni/nosrep/sweiv/ppa` ->
`app/views/person/index`）

これで

[code]

    git mv "$i" "$(echo $i | rev | cut -d '.' -f 2- | rev).haml";
    
[/code]

は元のファイル名から `.erb` だけ削り、`.haml` を加えて、`git mv` に渡すって感じになります。




質問者と同じく[英語版サイトの解答](https://stackoverflow.com/a/9151943/4037)を入れると

[code]

    for i in $(find . -iname "*.erb"); do
        git mv "$i" "$(echo $i | rev | cut -d '.' -f 2- | rev).haml";
    done
    
[/code]

ですが、これだけだと価値を足していないので、解説してみます。

[code]

    $(find . -iname "*.erb")
    
[/code]

で、`.erb` で終わるファイルをすべてリストアップします。それを `for` で1つずつ見ていきます。

次に

[code]

    $(echo $i | rev | cut -d '.' -f 2- | rev)
    
[/code]

を見ていきます。

[code]

    echo $i | rev
    
[/code]

でファイルへのパスを逆向きにします（例：`app/views/person/index.html.erb` ->
`bre.xedni/nosrep/sweiv/ppa`）。

[code]

    cut -d '.' -f 2-
    
[/code]

で、ファイルをドット `.` で区切り、2番目以降だけ取り出します（つまり、`bre.` だけ消す）。

最後に `rev` で文字を元の正方向に戻します。（例：`xedni/nosrep/sweiv/ppa` ->
`app/views/person/index`）

これで

[code]

    git mv "$i" "$(echo $i | rev | cut -d '.' -f 2- | rev).haml";
    
[/code]

は元のファイル名から `.erb` だけ削り、`.haml` を加えて、`git mv` に渡すって感じになります。

