[vi][小技] vimを使って複数のファイルの改行コードを一括変更する

よそからもらってきたファイルを展開してアチャー :disappointed: な気分になったとき用です。

下記は、カレントディレクトリ以下にある拡張子PHPのファイルの改行コードをLFにします。

```shell-session
find . -name \*.php -exec vi -c ':e ++ff=dos' -c ':set ff=unix' -c ':wq' \{\} \;
```



# 解説

## `find [ディレクトリ]`

指定したディレクトリ以下のファイルを探します。

## `-name \*.php`

ファイル名の末尾が.phpに一致するファイルを探します。

## `-exec [コマンド] \{\} \;`

見つかったファイルひとつひとつに対してコマンドを実行します。

`\{\}`の部分がファイル名になります。

`\;`はコマンドの終了位置を示します。

## `-c ':e ++ff=dos'`

改行コードをCRLFとしてファイルを開き直します。

## `-c ':set ff=unix'`

改行コードをLFにするようにします。

## `-c ':wq'`

ファイルを保存してviを終了します。

# 試した環境

viのバージョン

```
% vi --version                                                                                                                    (~/projects/nikkeir-portal/src)
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 22:32:42)
Included patches: 1-1829
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by pkg-vim-maintainers@lists.alioth.debian.org
Small version without GUI.  Features included (+) or not (-):
+acl             -farsi           -mouse_sgr       -tag_any_white
-arabic          -file_in_path    -mouse_sysmouse  -tcl
-autocmd         -find_in_path    -mouse_urxvt     -termguicolors
-balloon_eval    -float           -mouse_xterm     +terminfo
-browse          -folding         +multi_byte      -termresponse
+builtin_terms   -footer          -multi_lang      -textobjects
-byte_offset     +fork()          -mzscheme        -timers
-channel         -gettext         -netbeans_intg   -title
-cindent         -hangul_input    +packages        -toolbar
-clientserver    +iconv           -path_extra      -user_commands
-clipboard       -insert_expand   -perl            +vertsplit
-cmdline_compl   -job             -persistent_undo -virtualedit
+cmdline_hist    +jumplist        -printer         +visual
-cmdline_info    -keymap          -profile         -visualextra
-comments        -langmap         -python          -viminfo
-conceal         -libcall         -python3         -vreplace
-cryptv          -linebreak       -quickfix        +wildignore
-cscope          -lispindent      -reltime         -wildmenu
-cursorbind      -listcmds        -rightleft       +windows
-cursorshape     -localmap        -ruby            +writebackup
-dialog          -lua             -scrollbind      -X11
-diff            -menu            -signs           +xfontset
-digraphs        -mksession       -smartindent     -xim
-dnd             -modify_fname    -startuptime     -xsmp
-ebcdic          -mouse           -statusline      -xterm_clipboard
-emacs_tags      -mouse_dec       -sun_workshop    -xterm_save
-eval            -mouse_gpm       -syntax          -xpm
+ex_extra        -mouse_jsbterm   -tag_binary      
-extra_search    -mouse_netterm   -tag_old_static  
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H   -Wdate-time  -g -O2 -fdebug-prefix-map=/build/vim-vY1bx1/vim-7.4.1829=. -fPIE -fstack-protector-strong -Wformat -Werror=format-security -DTINY_VIMRC -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Linking: gcc   -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim    -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE  -lm -ltinfo  -lselinux -lacl -lattr -ldl 
```