2010-12-01

macで複数ファイル内容の一括置換

macでというか、unixでというか。

例えば、現在のフォルダの中のすべてのcgiの先頭行を
#!/usr/bin/perlから#!/usr/local/bin/perlに変更したい時

find ./ -name "*.cgi" -exec perl -i -pe 's|#!/usr/bin/perl|#!/usr/local/bin/perl|' {} \;

を、ターミナルから実行。

解説

find [dir name] ← UNIXコマンドの一。条件に合うファイルを指定したフォルダ以下から探す。
-name "[target name]"← 名前で検索しろよ、というoption。*はワイルドカードとして使用。
-exec [cmd] {}←見つかったファイルのパスを{}に代入してcmdの内容を実行しろ、というoption。
  \; ← findここで終わり、の宣言。( \は;をshellではなくfindに渡すためのエスケープ文字)

で、

perl ← 実行するのはperlスクリプトですよ、って宣言。
-e ← perlを実行して処理が済んだらperlを終了しますよってoption。
-p ← 置換をファイルの先頭から最後までループでやるよっていうoption
-i ← 複数ファイル一括処理option。

's|[a]|[b]|'  ← aという文字列をbに置換しろよ、という命令。


ということでした。



findのoption一覧
検索の条件-基本機能
-name [file name]指定した文字列のファイル・ディレクトリを検索
-user [user name]指定したユーザーが所有するファイル・ディレクトリを検索
-group [group name]指定したグループが所有するファイル・ディレクトリを検索
-type [filetype]ファイルの種類を指定して検索
b:ブロック型特殊ファイル c:キャラクタ型特殊ファイル d:ディレクトリ l:シンボリックリンク f:通常ファイル
検索の条件-日時機能
-atime (+/-)n最後にアクセスしたのがn日前のファイル・ディレクトリを検索(+n:n日以上、-n:n日以下)
-ctime (+/-)n最後にステータスが修正されたのがn日前のファイル・ディレクトリを検索(+n:n日以上、-n:n日以下)
-mtime (+/-)n最後にデータが修正されたのがn日前のファイル・ディレクトリを検索(+n:n日以上、-n:n日以下)
-mmin (+/-)n最後にデータが修正されたのがn分前のファイル・ディレクトリを検索(+n:n分以上、-n:n分以下)
-newer [file name]指定したファイルよりも後に更新されているファイル・ディレクトリを検索
検索の条件-サイズ機能
-size n[c/k/b]nのサイズのファイルを検索(c:バイト、k:キロバイト、b:ブロック-1ブロック=512バイト)
検索結果の処理機能
-ls詳細を一覧表示する
-print検索結果の標準出力
-fprint [file name]検索結果を指定したファイルに書き出す
-exec [command] {} \;検索結果をコマンドに引き渡して実行
pealのoption一覧

-0[octal]       specify record separator (\0, if no argument)
  -a              autosplit mode with -n or -p (splits $_ into @F)
  -C[number/list] enables the listed Unicode features
  -c              check syntax only (runs BEGIN and CHECK blocks)
  -d[:debugger]   run program under debugger
  -D[number/list] set debugging flags (argument is a bit mask or alphabets)
  -e program      one line of program (several -e's allowed, omit programfile)
  -f              don't do $sitelib/sitecustomize.pl at startup
  -F/pattern/     split() pattern for -a switch (//'s are optional)
  -i[extension]   edit <> files in place (makes backup if extension supplied)
  -Idirectory     specify @INC/#include directory (several -I's allowed)
  -l[octal]       enable line ending processing, specifies line terminator
  -[mM][-]module  execute "use/no module..." before executing program
  -n              assume "while (<>) { ... }" loop around program
  -p              assume loop like -n but print line also, like sed
  -P              run program through C preprocessor before compilation
  -s              enable rudimentary parsing for switches after programfile
  -S              look for programfile using PATH environment variable
  -t              enable tainting warnings
  -T              enable tainting checks
  -u              dump core after parsing program
  -U              allow unsafe operations
  -v              print version, subversion (includes VERY IMPORTANT perl info)
  -V[:variable]   print configuration summary (or a single Config.pm variable)
  -w              enable many useful warnings (RECOMMENDED)
  -W              enable all warnings
  -x[directory]   strip off text before #!perl line and perhaps cd to directory
  -X              disable all warnings

0 件のコメント: