はじめての方へ
質問箱
Team
相談箱
編集のすすめ
PukiWiki改造メモ
最近更新100件
最近更新ノート
UNIX
コマンド
便利な技
周辺機器
基礎知識
学生ツール
設定、設定ファイル
会津大学ローカル
会津大学への接続
講義関係
過去物
検索
ツールボックス
新しいページの作成
バックアップの表示
リンク元
最近更新したページ
全ページ
ヘルプ
凍結
アップロード
ページ名の変更
recent(10)
2019-11-29
質問箱/43
2019-11-14
質問箱/44
2018-04-06
UNIX/設定
2017-07-28
UNIX/設定、設定ファ%
2017-04-17
相談箱
2016-11-14
RecentDeleted
2016-07-31
UNIX/周辺機器/USBストレージ
UNIX/コマンド/変換/bmeps - 画像ファイルを高品質なepsに変換
2016-04-21
UNIX/便利な技/テストの自動化
2016-04-11
施設の略記号一覧
今日の人気
UNIX/コマンド/シェル・シェル組み込み/zsh
(7)
UNIX/コマンド/変換/convert
(6)
UNIX/コマンド/変換/mogrify
(6)
過去物/UNIX/学生ツール/ゲーム/xsoldier
(5)
Help
(5)
施設の略記号一覧
(4)
UNIX/設定、設定ファイル/.rhosts
(4)
UNIX/コマンド/プロセス管理/renice
(4)
InterWiki
(3)
UNIX/便利な技/emacsの技
(3)
UNIX/学生ツール/カレンダー・時計/cal
(3)
UNIX/基礎知識/ワイルドカード、メタキャラクタ
(3)
UNIX/コマンド/X/xsetroot
(3)
整形ルール
(3)
UNIX/周辺機器/USBストレージ
(3)
UNIX/基礎知識/パス
(3)
UNIX/基礎知識/エスケープキャラクタ
(3)
UNIX/設定、設定ファイル/.screenrc
(3)
UNIX/コマンド/tex/ebb
(3)
WikiName
(3)
昨日の人気
UNIX/コマンド/変換/mogrify
(11)
UNIX/コマンド/変換/convert
(7)
UNIX/基礎知識/バックグラウンド、フォアグラウンド
(7)
UNIX/設定、設定ファイル/.rhosts
(5)
UNIX/コマンド/プロセス管理/nice
(5)
UNIX/コマンド/ファイル管理/chmod
(5)
UNIX/コマンド/tex/dvipdf
(4)
UNIX/学生ツール/elisp/windows.el
(4)
UNIX/学生ツール/ユーザ検索プログラム/tknesoko
(4)
質問箱/30
(4)
UNIX/コマンド/X/xset
(4)
UNIX/基礎知識/リダイレクト、パイプ
(4)
UNIX/設定、設定ファイル/.cshrc
(4)
UNIX/基礎知識/ワイルドカード、メタキャラクタ
(4)
UNIX/コマンド/クライアント/ncftp
(4)
UNIX/コマンド/テキスト処理/sed
(4)
RecentNotes
(3)
質問箱/43
(3)
施設の略記号一覧
(3)
UNIX/コマンド/ユーザー情報/whoami
(3)
最近の人気
UNIX/コマンド/変換/mogrify
(17)
UNIX/コマンド/変換/convert
(13)
UNIX/基礎知識/バックグラウンド、フォアグラウンド
(10)
UNIX/設定、設定ファイル/.rhosts
(9)
UNIX/コマンド/シェル・シェル組み込み/zsh
(9)
UNIX/コマンド/ファイル管理/chmod
(7)
施設の略記号一覧
(7)
UNIX/基礎知識/ワイルドカード、メタキャラクタ
(7)
UNIX/設定、設定ファイル/.cshrc
(6)
UNIX/コマンド/tex/dvipdf
(6)
UNIX/コマンド/X/xsetroot
(6)
Help
(6)
UNIX/学生ツール/elisp/windows.el
(5)
UNIX/基礎知識/リダイレクト、パイプ
(5)
質問箱/30
(5)
UNIX/設定、設定ファイル/.procmailrc
(5)
UNIX/学生ツール/ブラウザ/w3m
(5)
過去物/UNIX/学生ツール/ゲーム/xsoldier
(5)
UNIX/コマンド/プロセス管理/nice
(5)
UNIX/学生ツール/カレンダー・時計/cal
(5)
全体の人気
UNIX/コマンド/テキスト処理/sed
(78864)
UNIX/コマンド/テキスト処理/sort
(64100)
UNIX/コマンド/シェル・シェル組み込み/foreach
(62733)
UNIX/コマンド/テキスト処理/join
(58088)
UNIX/コマンド/ファイル管理/touch
(57310)
UNIX/コマンド/ファイル管理/rm
(54181)
UNIX/基礎知識/バックグラウンド、フォアグラウンド
(54136)
UNIX/設定、設定ファイル/.forward
(51828)
UNIX/コマンド/検索/find
(51051)
UNIX/コマンド/テキスト処理/cat
(49561)
UNIX/学生ツール/ユーザ検索プログラム/gdoko
(45841)
UNIX/コマンド/エディタ/vim
(44008)
UNIX/コマンド/プロセス管理/kill
(43989)
UNIX/コマンド/変換/mogrify
(43821)
UNIX/設定、設定ファイル/.Xmodmap
(43791)
UNIX/コマンド/クライアント/ncftp
(41919)
UNIX/コマンド/シェル・シェル組み込み/source
(41819)
UNIX/コマンド/tex/dvipdfm
(39363)
UNIX/設定、設定ファイル/.xinitrc
(39202)
UNIX/コマンド/変換/split
(38651)
total:
175275
t
od
ay:
470
yes
terday:
652
now:
11
本文
ノート
編集
差分
Edit of UNIX/コマンド/検索/find
TITLE:find - ファイルの検索 #navi(UNIX/コマンド) find コマンドは指定したディレクトリ階層以下のファイルを検索するコマンドです。例えば % find . -name '*.c' とすると、カレントディレクトリ以下の拡張子 .c のファイルを検索し、一覧表示します。 % find [path...] [option] [expression] [action] #会津大学において /usr/bin/find よりも /usr/local/bin/find のほうがバージョンが新しいようなのでこちらの説明をします。 #contentsx *オプション [#s8b9ce92] オプション(option)は以下のものが指定可能です。 |-depth|ディレクトリ本体の前に,ディレクトリの内容を先に評価する| |-follow |シンボリック・リンクの参照先を検索する| |-xdev|他のファイル・システムにあるディレクトリは探索しない| |-maxdepth <levels>|最大で <levels> の深さまで探索する| 会津大学でのホームディレクトリは実はシンボリックリンクなので、% find $HOME -follow とやらなければいけないのですが、これだとホームディレクトリ内のシンボリックリンクも展開してしまうので、上の例では % find $HOME/. のように /. を追加してシンボリックリンクであることを意識させない工夫をしています。 ( % ls -ld $HOME と % ls -ld $HOME/. を比べてみてください。 lrwxrwxrwx のように左が l の場合シンボリックリンクです。) 判別式(expression)は以下のものが指定可能です。 n の部分は +n にすると n 以上、-n にすると n 以下、 n だけの場合 n に等しい という意味になります。 |-name pattern|pattern が現在のファイル名と一致する場合、真。この pattern にワイルドカードを使う際は、シェルで展開させずに find コマンドに渡すために "pattern" のように引用符で囲むか \ でエスケープさせる必要がある| |-iname pattern|大文字小文字を区別しない名前検索| |-atime [+-]n|n 日前にアクセスされているファイルを検索する| |-ctime [+-]n|ステータスが n 日前に変更されているファイルを検索する| |-mtime [+-]n|データが n 日前に変更されているファイルを検索する | |-empty|空なファイルや中身のないディレクトリを検索する| |-user uname |所有者がunameなファイルを検索する(IDの数値も指定可能)| |-group gname|グループ名がgnameのファイルを検索する(ID番号も指定可)| |-perm [+-=]mode |ファイルのアクセス権がmodeであるファイルを検索する。modeには8進数を用いることもできる。例えば +a=w のように + とすると、この条件のなかのいずれかにあてはまれば真となる。a とは ugo のことなので -rw-r--r-- のような許可でも u=w は当てはまるので真となる。-a=x のように - とすると、この条件すべてにマッチすれば真となる。この場合は -rwxr-xr-x のような許可ならば真となる。= または省略の場合はよりきつく、完全マッチした場合のみ真となる。| |-type c |指定したファイル・タイプを検索する。c には&br;b ブロックデバイス&br;c キャラクタデバイス&br;d ディレクトリ&br;f ファイル&br;l シンボリックファイル&br;p 名前付きパイプ&br;s ソケット&br;を指定する| |-size [+-]n[bckw] |nのサイズのファイルを検索する。nの後にcを付加すると単位がバイトに,kを付加するとKバイトになる。何も付けないとブロック(通常は1ブロック=512バイト)になる| |-inum n|inode 番号 n のファイルを検索する| |-newer file|file よりタイムスタンプが新しいファイルを検索する| また、さらに判別式中の operator が以下のようになっています。 |( expr ) |カッコのなかを優先的に判別する| |-not expr |exprが異なる場合,検索対象となる。! expr も同じ| |expr1 -and expr2 |expr1とexpr2をandで評価する。expr1 -a expr2 も同じ。また expr1 expr2 も同じ| |expr1 -or expr2 |expr1とexpr2をorで評価する。expr1 -o expr2 も同じ| アクション(action)は以下のものが指定可能です。 |-print |検索結果を標準出力する。このとき結果をフルパスで表示する。デフォルトなので省略可| |-fprint file |検索結果をfileに書き出す。同名のファイルがある場合は上書きをする| |-exec command \; |検索後,commandを実行する。このとき {} が検索されたファイル名におきかわる。; までがコマンドになる。このとき、シェルの ; にならないように \; のようにエスケープシーケンスを使用する必要がある。| |-ok command \; |-execと同様に検索後commandを実行する。ただし,ユーザーに問い合わせる| |-ls |結果をファイル詳細付きで表示する。"ls -dils"と同様な形式を指定する| *使い方例 [#k80259fe] **ファイル検索 [#s522f2a3] % find . -name 'test.txt' とすると、カレントディレクトリ以下の test.txt という名前のファイルを検索します。 サブディレクトリも再帰的に辿って検索します。 ワイルドカードも使えます。 % find . -name '*.txt' とすると拡張子 .txt のファイルを検索し、一覧表示します。 シェルにワイルドカードを展開されてしまわないように、 ' (シングルクォーテーション) で挟んでおくのを習慣づけておくと良いです。 一覧表示のファイル名をダブルクォーテーションで囲んで表示するには次のようにします。 % find . -name '*txt' -exec echo \"\{\}\" \; 通常のファイル一覧では、 ./Hoge hoge.txt ./hoge.txt のように表示されるのが、 "./Hoge hoge.txt" "./hoge.txt" のようにダブルクォーテーションに挟まれて表示されるようになります。 **コマンド実行 [#l26a73f5] 例えば、 % find $HOME/. -name "#*" -or -name ".*~" -or -name "*~" -exec rm {} \; とすると、ホームディレクトリ以下の # で始まるファイルや後ろに ~ のつくファイル (emacs の temp ファイル)を削除します。 しかし -exec オプションでは1つのファイルに対してコマンドを実行するため、1つのファイルに対して1つの rm プロセスを起動することになり、時間がかかるため(プロセス作成はかなりの負荷なのです)、 % find $HOME/. -name "#*" -or -name ".*~" -or -name "*~" | xargs rm のようにしたほうが良いです。途中でキャンセルもできますし。 [[xargs]] というコマンドは入力を引数のコマンドの引数として渡すコマンドです。 なので、-exec や -ok はあまり使う必要がありません。ファイル1つ1つに個別に処理をしなければならないような時ぐらいです。 **複数ファイル内検索 [#p0c56831] ファイル名を検索しつつ、ファイル中の文字列を検索するには % find . -name "[file_pattern]" | xargs grep [pattern] のようにします。grep のオプション -n をつければ行番号もでるので検索にはそのほうがよいかもしれません。 grep のオプション -l をつけると、マッチした行の表示ではなく、マッチした行のあるファイルのファイル名を表示します。 % find . -name "[file_pattern]" | xargs grep -l [pattern] 検索結果のファイル名に空白文字などが含まれていると、xargs がファイルをうまく認識してくれず、No such file とエラーがでてしまったりします。そういう時は % find . -name "[file_pattern]" -print0 | xargs -0 grep -l [pattern] のようにします。find -print0 でファイル名の区切り文字が、改行文字からNULL文字(\0)に変わります。 そして、xargs -0 オプションで xargs が認識するファイル名の区切り文字をNULL文字(\0)に限定して処理させます。 これにより、ファイル名に空白文字が含まれていても問題なく処理できるようになります。 **複数ファイル内文字列置換 [#eaf40a1c] ファイル名を検索しつつ、ファイル中の文字列を置換するには、 % find [path] -type f -name '[file_pattern]' | xargs grep -l '[対象文字列]' | xargs sed -i.bak 's/[対象文字列]/[置換後文字列]/g' のようにするとよさそうです。 sed -i でファイル内文字列を置換、上書きします。-i.bak としておけば .bak 拡張子のついたファイルにバックアップをとっておいてくれます。 **特定ファイルを除いてファイル名検索 [#ud9bed03] ある特定のファイル(ディレクトリ)を除いてファイルをリストするには % find . -name "[file_pattern]" -prune -o -print とします。[[svn]] を使用している場合に .svn ディレクトリを無視して zip ファイルを作ったりするのに便利です。 % find . -name ".svn" -prune -o -print | xargs zip a.zip #navi(UNIX/コマンド,,footer)
Do not change timestamp
TITLE:find - ファイルの検索 #navi(UNIX/コマンド) find コマンドは指定したディレクトリ階層以下のファイルを検索するコマンドです。例えば % find . -name '*.c' とすると、カレントディレクトリ以下の拡張子 .c のファイルを検索し、一覧表示します。 % find [path...] [option] [expression] [action] #会津大学において /usr/bin/find よりも /usr/local/bin/find のほうがバージョンが新しいようなのでこちらの説明をします。 #contentsx *オプション [#s8b9ce92] オプション(option)は以下のものが指定可能です。 |-depth|ディレクトリ本体の前に,ディレクトリの内容を先に評価する| |-follow |シンボリック・リンクの参照先を検索する| |-xdev|他のファイル・システムにあるディレクトリは探索しない| |-maxdepth <levels>|最大で <levels> の深さまで探索する| 会津大学でのホームディレクトリは実はシンボリックリンクなので、% find $HOME -follow とやらなければいけないのですが、これだとホームディレクトリ内のシンボリックリンクも展開してしまうので、上の例では % find $HOME/. のように /. を追加してシンボリックリンクであることを意識させない工夫をしています。 ( % ls -ld $HOME と % ls -ld $HOME/. を比べてみてください。 lrwxrwxrwx のように左が l の場合シンボリックリンクです。) 判別式(expression)は以下のものが指定可能です。 n の部分は +n にすると n 以上、-n にすると n 以下、 n だけの場合 n に等しい という意味になります。 |-name pattern|pattern が現在のファイル名と一致する場合、真。この pattern にワイルドカードを使う際は、シェルで展開させずに find コマンドに渡すために "pattern" のように引用符で囲むか \ でエスケープさせる必要がある| |-iname pattern|大文字小文字を区別しない名前検索| |-atime [+-]n|n 日前にアクセスされているファイルを検索する| |-ctime [+-]n|ステータスが n 日前に変更されているファイルを検索する| |-mtime [+-]n|データが n 日前に変更されているファイルを検索する | |-empty|空なファイルや中身のないディレクトリを検索する| |-user uname |所有者がunameなファイルを検索する(IDの数値も指定可能)| |-group gname|グループ名がgnameのファイルを検索する(ID番号も指定可)| |-perm [+-=]mode |ファイルのアクセス権がmodeであるファイルを検索する。modeには8進数を用いることもできる。例えば +a=w のように + とすると、この条件のなかのいずれかにあてはまれば真となる。a とは ugo のことなので -rw-r--r-- のような許可でも u=w は当てはまるので真となる。-a=x のように - とすると、この条件すべてにマッチすれば真となる。この場合は -rwxr-xr-x のような許可ならば真となる。= または省略の場合はよりきつく、完全マッチした場合のみ真となる。| |-type c |指定したファイル・タイプを検索する。c には&br;b ブロックデバイス&br;c キャラクタデバイス&br;d ディレクトリ&br;f ファイル&br;l シンボリックファイル&br;p 名前付きパイプ&br;s ソケット&br;を指定する| |-size [+-]n[bckw] |nのサイズのファイルを検索する。nの後にcを付加すると単位がバイトに,kを付加するとKバイトになる。何も付けないとブロック(通常は1ブロック=512バイト)になる| |-inum n|inode 番号 n のファイルを検索する| |-newer file|file よりタイムスタンプが新しいファイルを検索する| また、さらに判別式中の operator が以下のようになっています。 |( expr ) |カッコのなかを優先的に判別する| |-not expr |exprが異なる場合,検索対象となる。! expr も同じ| |expr1 -and expr2 |expr1とexpr2をandで評価する。expr1 -a expr2 も同じ。また expr1 expr2 も同じ| |expr1 -or expr2 |expr1とexpr2をorで評価する。expr1 -o expr2 も同じ| アクション(action)は以下のものが指定可能です。 |-print |検索結果を標準出力する。このとき結果をフルパスで表示する。デフォルトなので省略可| |-fprint file |検索結果をfileに書き出す。同名のファイルがある場合は上書きをする| |-exec command \; |検索後,commandを実行する。このとき {} が検索されたファイル名におきかわる。; までがコマンドになる。このとき、シェルの ; にならないように \; のようにエスケープシーケンスを使用する必要がある。| |-ok command \; |-execと同様に検索後commandを実行する。ただし,ユーザーに問い合わせる| |-ls |結果をファイル詳細付きで表示する。"ls -dils"と同様な形式を指定する| *使い方例 [#k80259fe] **ファイル検索 [#s522f2a3] % find . -name 'test.txt' とすると、カレントディレクトリ以下の test.txt という名前のファイルを検索します。 サブディレクトリも再帰的に辿って検索します。 ワイルドカードも使えます。 % find . -name '*.txt' とすると拡張子 .txt のファイルを検索し、一覧表示します。 シェルにワイルドカードを展開されてしまわないように、 ' (シングルクォーテーション) で挟んでおくのを習慣づけておくと良いです。 一覧表示のファイル名をダブルクォーテーションで囲んで表示するには次のようにします。 % find . -name '*txt' -exec echo \"\{\}\" \; 通常のファイル一覧では、 ./Hoge hoge.txt ./hoge.txt のように表示されるのが、 "./Hoge hoge.txt" "./hoge.txt" のようにダブルクォーテーションに挟まれて表示されるようになります。 **コマンド実行 [#l26a73f5] 例えば、 % find $HOME/. -name "#*" -or -name ".*~" -or -name "*~" -exec rm {} \; とすると、ホームディレクトリ以下の # で始まるファイルや後ろに ~ のつくファイル (emacs の temp ファイル)を削除します。 しかし -exec オプションでは1つのファイルに対してコマンドを実行するため、1つのファイルに対して1つの rm プロセスを起動することになり、時間がかかるため(プロセス作成はかなりの負荷なのです)、 % find $HOME/. -name "#*" -or -name ".*~" -or -name "*~" | xargs rm のようにしたほうが良いです。途中でキャンセルもできますし。 [[xargs]] というコマンドは入力を引数のコマンドの引数として渡すコマンドです。 なので、-exec や -ok はあまり使う必要がありません。ファイル1つ1つに個別に処理をしなければならないような時ぐらいです。 **複数ファイル内検索 [#p0c56831] ファイル名を検索しつつ、ファイル中の文字列を検索するには % find . -name "[file_pattern]" | xargs grep [pattern] のようにします。grep のオプション -n をつければ行番号もでるので検索にはそのほうがよいかもしれません。 grep のオプション -l をつけると、マッチした行の表示ではなく、マッチした行のあるファイルのファイル名を表示します。 % find . -name "[file_pattern]" | xargs grep -l [pattern] 検索結果のファイル名に空白文字などが含まれていると、xargs がファイルをうまく認識してくれず、No such file とエラーがでてしまったりします。そういう時は % find . -name "[file_pattern]" -print0 | xargs -0 grep -l [pattern] のようにします。find -print0 でファイル名の区切り文字が、改行文字からNULL文字(\0)に変わります。 そして、xargs -0 オプションで xargs が認識するファイル名の区切り文字をNULL文字(\0)に限定して処理させます。 これにより、ファイル名に空白文字が含まれていても問題なく処理できるようになります。 **複数ファイル内文字列置換 [#eaf40a1c] ファイル名を検索しつつ、ファイル中の文字列を置換するには、 % find [path] -type f -name '[file_pattern]' | xargs grep -l '[対象文字列]' | xargs sed -i.bak 's/[対象文字列]/[置換後文字列]/g' のようにするとよさそうです。 sed -i でファイル内文字列を置換、上書きします。-i.bak としておけば .bak 拡張子のついたファイルにバックアップをとっておいてくれます。 **特定ファイルを除いてファイル名検索 [#ud9bed03] ある特定のファイル(ディレクトリ)を除いてファイルをリストするには % find . -name "[file_pattern]" -prune -o -print とします。[[svn]] を使用している場合に .svn ディレクトリを無視して zip ファイルを作ったりするのに便利です。 % find . -name ".svn" -prune -o -print | xargs zip a.zip #navi(UNIX/コマンド,,footer)
ログインまたはアカウント作成