UNIX の忘れがちなシェルコマンド備忘録
便利だが忘れがちなコマンド構文を備忘録として残していく第一弾。
1. 指定する文字列を含む文書を一括検索してフルパスで表示する
% find PATH -type f -print | xargs grep 'hoge' 2> /dev/null
PATH は検索を開始したい場所。hoge は検索したい文字列。
'xargs' コマンドは 'コマンドA | xargs コマンドB' のように2つのコマンドをパイプでつなぐことで前のコマンド(コマンドA)で取得した値(標準出力)を読み込み、それを引数としてコマンドBへ渡して実行させる役割を果たす。組み合わせや引数の組み合わせ次第では、コマンドが許容の長さを超える引数のリストを受け付けない問題を回避できたり、処理を並列化して高速化できる場合がある。
'find' コマンドは-typeオプションで、ファイルタイプを指定して検索できる。値を 'f' にすると通常ファイルを検索し、 'd' はディレクトリを、 'l' はシンボリックリンクを検索する。
また、 'find' コマンドに-printオプションをつけると、フルパスで検索結果を標準出力する。
コマンドに '2> /del/null' を付けると標準エラー出力を/dev/nullに捨てることができる。ブラウザのキャッシュなどが走査対象に含まれていて、'検索対象のファイルやディレクトリが見つからない'等のエラーが頻出する場合は、これらを表示しないようにできる。
2. ディレクトリ内にある全ての文書内の文字列Aを文字列Bに置き換える
% grep -l '文字列A' ./* | xargs sed -i.bak -e 's/文字列A/文字列B/g'
再び'xargs' コマンドを含む構文のコマンドで、「置換・削除」を行うための'sed' コマンドをパイプで繋ぐもの。
'sed' コマンドは-iオプションをつけると、変換処理後にファイルを上書き保存できる。更にこのオプションに文字列を続けると、元ファイルをこの文字列を接尾語としたファイルに別名保存して残しておくことができる。なお、文字列を続ける場合は、-iとの間にスペースを挟んではいけない。
'sed' コマンドの-eオプションをつけると、続けて指定する条件式に従って変換処理を行うことができる。このコマンドには、ほかに-fオプションも用意されていて、変換処理を行うための条件式が記述されたファイルの保存場所をPATH指定して、このファイルの内容に基づいて変換処理を進めることもできる。
'sed -e' で全文を一括置換する場合の構文は、's/文字列A/文字列B/g'。ほかにもsに繋げる構文の組み合わせでケースに応じた色々な置換ができる。
% sed -e "s/文字列A/文字列B/" # 置換 行で最初に出てきた'文字列A'を'文字列B'に置換 % sed -e "s/^文字列A/文字列B/" # 行頭(^)の'文字列A'を'文字列B'に置換 % sed -e "s/文字列A\$/文字列B/" # 行末($)の'文字列A'を'文字列B'に置換($は\でescape) % sed -e "s/~/文字列B/" # 行頭に'文字列B'を追加 % sed -e "s/\$/文字列B/" # 行末に'文字列B'を追加 % sed -e "s/.*/文字列C/" # すべての行を'文字列C'に置換
* * *
Web制作等で複数ファイルに跨る変数やディレクトリ構造そのものを変える必要がある時に、変更漏れのファイルが無いか気になるところ。むしろ、そのような効率の悪い作業が発生しないように、編集効率の良いファイル構成を組みたいところだけど、作業中は仕様変更が頻繁に起こってそうもいかないことも少なからずある。
そんな時に、未編集ファイルの一括検出や置換が効率良くできるこれらコマンドは、非常に便利で重宝している。