Mac の find コマンド

informatics/commands_mac/find_mac
6-1-2017 updated

  1. 概要: find とは
  2. 使用例
    • find と grep を使い,複数ファイルの中身を一括置換する
    • 特定の階層にあるファイルを一括削除 (一括移動なども可能)

広告

概要: find とは

find は,指定した規則に従ってファイルやディレクトリを検索するコマンドである (1)。

$ find 検索するフォルダ option

のように使う。option の部分には,以下のようなオプションを並べて書いていくことができる。詳細は文献 1 を参照。


-name "filename"

指定した文字列を名前にもつファイルおよびディレクトリを検索する。

-usr "username"

指定したユーザーが所有するファイルおよびディレクトリを検索する。

-ls 詳細を一覧表示する
-print 検索結果の標準出力
-fprint "filename" 検索結果を指定したファイルに書き出す。
-exec "command" {} \;

検索結果をコマンドに引き渡して実行する。

「使用例」に,このオプションを使って特定の階層にあるファイルを一括削除する方法を示してある。



広告

使用例

find と grep を使ってターミナルでファイルの中身を検索する

ub2 というフォルダに html ファイル を格納し,このサイトの一部を作っていた際,始めはサイドバーの縦幅を 1500 px に指定してあったが,内容が増えてきたので全ての html ファイルで 2000 px に置換することにした (2)。システムは Mac OS X Mavericks, Ruby のバージョンは 2.0.0-p481。

この作業は 3 つの段階から成る。

  1. find で目的のファイルを探す。
  2. その中で,grep で目的の文字列を探す。
  3. ruby で一括置換する。

まずは,それぞれのページの html ファイルを ub2 というフォルダ内で検索する。ワイルドカードと " " を使って,

$ find ub2 -name "*.html"

これで,ub2 フォルダ内にある html ファイルの一覧が表示される。次に,この結果を grep に渡してサイドバーを指定している部分を検索させる。このサイトのサイドバーは iframe を使って表示させており,タグは

<iframe width="175px" scrolling="no" height="1500px" frameborder="0" src="../../sidebar.html"></iframe>

である。

$ find -name "*.html" | xargs grep -l 1500px

とすると,1500px という文字列を含むファイルの一覧が表示される。grep の -l は,結果をファイル名のみで表示するオプションである。ここで,<iframe width="175px" としてしまうと < が 命令とみなされてエラーになるので注意。また xargs は結果を次のコマンドに引き渡すということ。


次に,上記の検索結果を Ruby に渡して一括置換するコマンドを追加する。

$ find -name "*.html" | xargs grep -l 1500px | ruby -i -ep 'gsub!(/1500px/,"3000px")'

文献 2 に従うとこれで一括置換できるはずなのだが,なぜかうまく動かなかった。-ep を -e -p に変える,gsub を $_.gsub に変えるなどしてみたが駄目だった。


そこで grep を使わない方法 (3) を検討,結果的にこれでうまく置換することができた。コマンドの意味はよくわからない。

$ find 探したい場所 -type f -name '対象ファイル名' -print0 | xargs -0 ruby -i -p -e '$_.gsub!(/置換前の文字列/, "置換後の文字列")' が構文と書いてあったので,


$ find ub2 -type f -name "*.html" -print0 | xargs -0 ruby -i -p -e '$_.gsub!(/1500px/,"3000px")' 


とした。今回は他の部分に 1500px という文字列はなかったのでこれで良かったが," " を含む長い部分での置換もできるようにしておきたい。ちなみに,以下のソフトでもテキストの一括置換は可能である。コマンドラインに慣れていない場合は,これらを使うのも良い。

  • TextSS: Windows で使えるテキストエディタ。一括置換可能。
  • TextWrangler: Mac で使えるテキストエディタ。一括置換可能。


特定の階層にあるファイルを一括削除 (一括移動なども可能)

find には,結果を他のコマンドに引き渡す -exec オプション がある。xargs との違いはよくわからない。-exec オプションを利用し,検索結果を rm に引き渡せば,ヒットするファイルを一括で削除できることになる。

このサイトでは,コメント欄を設置する 際に zpcomment_ファイル名.php というファイルを作って,html ファイルを同じフォルダに置いている。サーバーにアップロードしたのち,このファイルがローカルにあると邪魔になるので,文献 4 の方法で以下のように一括削除した。

find . -name "zpcomment*" -exec rm {} \;

find の次のドットは,現在自分がいる階層以下という意味である。次回はここをフォルダ指定にしておいた方が,予期しない結果を減らせて安全だろう。rm の次の {} \; の意味はよくわからない。


コメント欄

一言コメントをどうぞ! (基本500字まで - 100字のページもあるかも)



このコメント欄は各ページにあるので、いつ管理人がコメントを見ることになるのか分かりません。内容について質問がある場合は、下のリンク先のフォームから質問頂ければ、早めに返信するようにします。


References

  1. find どこにあるかわからないファイルを検索. Link.
  2. rakkyoo の備忘録 複数のファイル内の文字列を一括置換. Link.
  3. 文字列一括置換 Link.
  4. フォルダ下にある特定のファイルを速攻で消す方法 (Mac & Linux) Link: Last access 06/01/2017.