[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

3. アクション

findの式で与えた基準に一致するファイルの情報を出力する方法が,い くつかあります.標準出力または指名したファイルに,情報を出力することが可 能です.ファイル名を引数として,コマンドを実行することも可能です.これら のコマンドを,選択したファイルへのフィルターとして以外でも使用することが 可能です.

3.1 ファイル名の出力  
3.2 ファイル情報の出力  
3.3 コマンドの実行  
3.4 テストの追加  


3.1 ファイル名の出力

Action: -print
真の時,完全なファイル名を標準出力に出力し,改行を続けます.

Action: -fprint file
真の時,完全なファイル名をファイルfileに出力し,改行を続けます. findの実行時にfileが存在しない場合は作成されます.存在する 場合は0バイトに切り詰められます.ファイル名`/dev/stdout'と `/dev/stderr'は,特別な扱いをされます.それらはそれぞれ,標準出力と 標準エラー出力を参照します.


3.2 ファイル情報の出力

Action: -ls
真の時,現在のファイルを`ls -dils'の書式で標準出力にリストアップし ます.出力はこのようになります.

 
204744   17 -rw-r--r--   1 djm      staff       17337 Nov  2  1992 ./lwall-quotes

フィールドは以下のとおりです.

  1. ファイルのinodeナンバーです.inodeナンバーを元にしたファイルの検索方法は, See section 2.2.2 ハードリンク.

  2. ファイルのブロック数です.ブロック計算は,512バイトブロック単位を使用す る環境変数POSIXLY_CORRECTが設定されていない場合,1Kブロック単位で す.サイズを元にしたファイルの検索方法は,See section 2.4 サイズ.

  3. ファイルの形式と許可です.形式は,通常のファイルに対してはダッシュで表示 されます.それ以外のファイル形式に対しては,`-type'に対して使用され る文字です(see section 2.5 形式).許可は,読み込み,書き込み,そして実行で,それ ぞれファイルの所有者,そのグループ,そしてその他のユーザに対するものです. ダッシュは許可が与えられていないことを意味します.ファイルの許可の詳細は, See section 6. ファイルの許可.その許可を元にしたファイルの検索方法は, See section 2.7 許可.

  4. ファイルに対するハードリンクの数です.

  5. ファイルを所有しているユーザです.

  6. ファイルのグループです.

  7. ファイルのバイト単位のサイズです.

  8. ファイルが竿語の編集された日付です.

  9. ファイル名です.`-ls'は,ファイル名で使用されている出力不可能な文字 を,Cのようなバックスラッシュエスケープを使用して引用符で囲みます.

Action: -fls file
真の時,`-ls'に似ていますが,`-fprint'のようにfileに書き 出します(see section 3.1 ファイル名の出力).

Action: -printf format
真の時,`\'エスケープと`%'指示語を解釈しながら,formatを 標準出力に出力します.フィールドの幅と精度は,C関数のprintfの用に 指定可能です.`-print'とは異なり,`-printf'は文字列の終りに改 行を追加しません.

Action: -fprintf file format
真の時,`-printf'に似ていますが,`-fprint'のようにfileに 書き出します(see section 3.1 ファイル名の出力).

3.2.1 エスケープ  
3.2.2 書式指示語  
3.2.3 時間の書式  


3.2.1 エスケープ

`-printf'と`-fprintf'で認識されるエスケープは以下のとおりです.

\a
アラームベル.
\b
バックスペース.
\c
この書式の直後出力の停止し,出力をフラッシュ.
\f
フォームフィード.
\n
改行.
\r
キャリッジリターン.
\t
水平タブ.
\v
垂直タブ.
\\
バックスラッシュそのもの(`\').

`\'文字に他の文字が続くものは,通常の文字として扱われるので,両方が 出力され,(おそらくそれは入力ミスなので)標準エラー出力に警告メッセージが 出力されます.


3.2.2 書式指示語

`-printf'と`-fprintf'は,処理しているファイルに関する情報を出 力するため,以下の書式指示語をサポートします.Cのprintf関数と異な り,それらはフィールド幅の指定をサポートしていません.

`%%'はパーセント記号そのものです.他の文字が続く`%'文字は削除 され(が,それ<%>以外の文字は出力され),(おそらく入力ミスのため)標準出力 に警告メッセージが出力されます.

3.2.2.1 名前指示語  
3.2.2.2 所有者指示語  
3.2.2.3 サイズ指示語  
3.2.2.4 位置指示語  
3.2.2.5 時間指示語  


3.2.2.1 名前指示語

%p
ファイル名.
%f
前置されるディレクトリを削除したファイル名(最後の要素のみ).
%h
ファイル名に前置されるディレクトリ(最後の要素とその前のスラッシュ以外す べて).
%P
ファイル名で,それが見つけられたコマンドライン引数の名前は,最初から削除 されます.
%H
それによりファイルが見つけられた,コマンドライン引数.


3.2.2.2 所有者指示語

%g
ファイルのグループ名,または名前がない場合はグループID.
%G
ファイルの数値的なグループID.
%u
ファイルのユーザ名,または名前がない場合はユーザID.
%U
ファイルの数値的なユーザID.
%m
ファイルの許可(8進数)


3.2.2.3 サイズ指示語

%k
1Kブロック単位でのファイルサイズ(切上げ).
%b
512バイトブロック単位でのファイルサイズ(切上げ).
%s
バイト単位でのファイルサイズ.


3.2.2.4 位置指示語

%d
ディレクトリツリーでのファイルの深さ.コマンドラインのファイル名は,深さ が0です.
%F
ファイルが存在するファイルシステム.この値は,`-fstype'で使用される はずです(see section 2.9 ディレクトリ).
%l
シンボリックリンクのオブジェクト(ファイルがシンボリックリンクでない場合 は空文字です.)
%i
ファイルのinodeナンバー(10進数).
%n
ファイルのハードリンクのナンバー.


3.2.2.5 時間指示語

これらの指示語にはCのctime関数を使用するものもあります.その出力 は現在のロケールに依存しますが,典型的なものは以下のようになります.

 
Wed Nov  2 00:42:36 1994

%a
Cのctime関数で返される書式での,ファイルの最後にアクセスされた時 間.
%Ak
kで指定される書式での,ファイルの最後にアクセスされた時間 (see section 3.2.3 時間の書式).
%c
Cのctime関数で返される書式での,ファイルの最後にステータスが変更 された時間.
%Ck
kで指定される書式での,ファイルの最後にステータスが変更された時間 (see section 3.2.3 時間の書式).
%t
Cのctime関数で返される書式での,ファイルの最後に編集された時間.
%Tk
kで指定される書式での,ファイルの最後に編集された時間(see section 3.2.3 時間の書式).


3.2.3 時間の書式

以下は,指示語`%A',`%C',そして`%T'に対する書式で,それ はファイルのタイムスタンプを出力します.これらの書式には,Cの strftime関数のシステム間での違いにより,すべてのシステムで利用可 能でないものもあります.

3.2.3.1 時間の内容  
3.2.3.2 日付の内容  
3.2.3.3 時間の書式の組み合わせ  


3.2.3.1 時間の内容

以下の書式指示語は,時間の単一の内容を出力します.

H
時間(00..23)
I
時間(01..12)
k
時間( 0..23)
l
時間( 1..12)
p
ロケールの午前や午後
Z
タイムゾーン(例えば,EDT),またはタイムゾーンが定義されていない場合は何 も出力しない.
M
分(00..59)
S
秒(00..61)
@
1970年1月1日00:00 GMT以来の秒.


3.2.3.2 日付の内容

以下の書式指示語は,日付の単一の内容を出力します.

a
ロケールの略記された曜日名(Sun..Sat)
A
ロケールの完全な曜日名,可変長(Sunday..Saturday)
b
h
ロケールの略記された月名(Jan..Dec)
B
ロケールの完全な月名,可変長(January..December)
m
月(01..12)
d
日(01..31)
w
曜日(0..6)
j
年間の日付(001..366)
U
日曜日を週の最初の日とした時の,年間の週数(00..53)
W
月曜日を週の最初の日とした時の,年間の週数(00..53)
Y
年(1970...)
y
年の最後の2桁(00..99)


3.2.3.3 時間の書式の組み合わせ

以下の書式指示語は,時間と日付の組み合わせを出力します.

r
時間,12時間制(hh:mm:ss [AP]M)
T
時間,24時間制(hh:mm:ss)
X
ロケールの時間表現(H:M:S)
c
ロケールの日付と時間(Sat Nov 04 12:02:33 EST 1989)
D
日付(mm/dd/yy)
x
ロケールの日付表現(mm/dd/yy)


3.3 コマンドの実行

findlocateで作成されたファイル名のリストを,他のコマンド への引数として使用可能です.この方法で,ファイルへの任意の動作を実行する ことが可能です.

3.3.1 単一のファイル  
3.3.2 複数のファイル  
3.3.3 問い合わせ  


3.3.1 単一のファイル

ここに一つのファイルへのコマンドを,一度に実行する方法があります.

Action: -exec command ;
commandを実行します.0のステータスが返される場合は真です. findは,`-exec'以降のすべての引数を,`;'から成り立つ引 数に到達するまで,コマンドの部分として受けとります.それは,文字列 `{}'を現在のファイル名で置換し,コマンドにそれがある場所で処理さ れます.これらの構文はどちらも,シェルによる展開を防ぐために(`\'を 用いて)エスケープしたり,引用符で囲む必要があります.コマンドは, find を実行しているディレクトリで実行されます.

例えば,現在のディレクトリのそれぞれのCのヘッダファイルを,ファイル `/tmp/master'と比較するために以下のようにします.

 
find . -name '*.h' -exec diff -u '{}' /tmp/master ';'


3.3.2 複数のファイル

単一のファイルを処理する必要がある時もあります.しかし,それができない時, ファイル毎にコマンドを実行するより,できるだけ多くのファイルをコマンドで 実行した方が速くなります.これを行なうことで,それぞれのコマンドを開始す る時間を稼ぐことになります.

一度に一つ以上のファイルをコマンドで実行するために,xargsコマンド を使用し,以下のように呼び出して下さい.

 
xargs [option...] [command [initial-arguments]]

xargsは標準入力から引数を読み込み,それは空白(それは,ダブルクオー トやシングルクオートまたはバックスラッシュで保護可能)や改行で分離されて います.それはcommand (デフォルトで`/bin/echo')を,標準入力か ら読み込まれた引数が続くあらゆるinitial-argumentsを用いて,一回以 上実行します.標準入力の空白行は無視されます.

空白の分離名の代わりに,`find -print0'や`find -fprint0'を使用 し,GNU xargs,GNU tar,GNU cpio,またはperl へ,`-0'や`--null'オプションを与えて,出力を処理した方が安全で す.

以下のように,引数リストを処理するためシェルコマンドの置換(バッククオー ト)を使用することが可能です.

 
grep -l sprintf `find $HOME -name '*.c' -print`

しかし,その方法は,`.c'ファイル名の長さが,オペレーティングシステ ムのコマンドラインの長さの制限を超過する場合,エラーが生じるでしょう. xargsは,制限を超過しないようにするために必要なだけコマンドを実行 することで,その問題を避けます.

 
find $HOME -name '*.c' -print | grep -l sprintf

しかし,標準入力が端末であることを必要とするコマンド(例えば, less)の場合,シェルコマンドの置換の手法を使用する必要があります.

3.3.2.1 安全でないファイル名の扱い  
3.3.2.2 安全なファイル名の扱い  
3.3.2.3 コマンドサイズの制限  
3.3.2.4 ファイル名をばらまく  


3.3.2.1 安全でないファイル名の扱い

ファイル名には,引用符,バックスラッシュ,空白文字,そして改行でさえ含め ることが可能なので,処理のデフォルトモードでxargsを使用しながらそ れを処理することは安全ではありません.しかし,ほとんどのファイル名は空白 を含まないので,この問題は滅多に発生しません.安全なファイル名だと知って いるファイルを検索している場合のみ,それについて悩む必要はありません.

応用する際は,名前に特殊文字を含んでいるため,xargsファイルをうま く処理できない場合も多く,失われるデータもあります.この問題の重要性は, データの重要性に依存し,それを訂正するためにはできるだけ速く,失ったもの に気づくかに依存します.しかし,ここに,空白で分離した名前の使用で引き起 こされる究極の例があります.以下のコマンドが,毎日cronで実行され る場合,あらゆるユーザはあらゆるファイルを削除可能です.

 
find / -name '#*' -atime +7 -print | xargs rm

例えば,以下のようなことが可能でしょう.

 
eg$ echo > '#
vmunix'

`/'を現在のディレクトリとして,xargsを実行してしまった場合, そして,cronは`/vmunix'を削除するでしょう.

他のファイルを削除するために,例えば`/u/joeuser/.plan'は,以下のよ うにすることで可能でしょう.

 
eg$ mkdir '#
'
eg$ cd '#
'
eg$ mkdir u u/joeuser u/joeuser/.plan'
'
eg$ echo > u/joeuser/.plan'
/#foo'
eg$ cd ..
eg$ find . -name '#*' -print | xargs echo
./# ./# /u/joeuser/.plan /#foo


3.3.2.2 安全なファイル名の扱い

ここに,findが出力したファイル名を,他のプログラムでめちゃくちゃ にされたり誤解されたりしないで,他のプログラムで使用可能にする方法があり ます.この方法で生成されたファイル名に,`-0'や`--null'オプショ ンを,GNU xargs,GNU tar,GNU cpio,または, perlに渡すことで,処理することが可能です.

Action: -print0
真です.標準出力の完全なファイル名にヌル文字を続けて出力します.

Action: -fprint0 file
真です.`-print0'ににていますが,fileを`-fprint'のように 書き出します(see section 3.1 ファイル名の出力).


3.3.2.3 コマンドサイズの制限

xargsで,それぞれの実行時にコマンドに渡す引数の数を制御することが できます.デフォルトで,ARG_MAX - 2k,または20kまでの小さい方を, コマンド毎の文字として使用します.それは,制限以内のできるだけ多くの行と 引数を使用します.以下のオプションはこれらの値を変更します.

--no-run-if-empty
-r
標準入力が空白でない文字を含まない場合,コマンドを実行しません.デフォル トで,入力が無い場合でもコマンドは一度実行されます.

--max-lines[=max-lines]
-l[max-lines]
最大max-linesの空白でない入力行を,コマンドライン毎に使用します. 省略された場合,max-linesのデフォルトは1です.後置される空白は, 行を数える目的で,入力行を,次の入力行に論理的に連結します.`-x'を 暗黙に指定します.

--max-args=max-args
-n max-args
最大max-args個の引数を,コマンドライン毎に使用します.大きさが max-argsを超過した場合,それより小さいものが使用されますが,それは `-x'オプションが与えられていない場合に限り,その場合はxargs は終了します.

--max-chars=max-chars
-s max-chars
最大max-chars文字を,コマンドライン毎に使用し,それはコマンドと最 初の引数と引数文字列の最後の終端のヌルを含みます.

--max-procs=max-procs
-P max-procs
max-procsプロセスまで一度に実行します.デフォルトは1です. max-procsが0の場合,xargsは可能な限り多くのプロセスを,一度 に実行します.`-P'とともに,`-n',`-s',または`-l'オ プションを使用して下さい.そうしない場合,コマンドが実行される機会は,1 度しかありません.


3.3.2.4 ファイル名をばらまく

xargsは,処理するファイル名を,コマンドに対して与えた引数の間に挿 入可能です.コマンドの大きさを制限するオプションを与えていない場合 (see section 3.3.2.3 コマンドサイズの制限),このモードの処理は,`find -exec'と 等価です(see section 3.3.1 単一のファイル).

--replace[=replace-str]
-i[replace-str]
最初の引数のreplace-strがあるところを,標準入力から読み込まれる名 前に置換します.また,引用符で囲まれていない空白は,引数の最後になりませ ん.replace-strが省略された場合,デフォルトは`{}'です (`find -exec'に似ています).`-x'と`-l 1'を暗黙に指定しま す.例えば,`bills'ディレクトリのそれぞれのファイルをソートし,出力 をファイル名に`.sorted'を後置したものに書き出す時,以下のようにする ことで可能です.

 
find bills -type f | xargs -iXX sort -o XX.sorted XX

`find -exec'を使用した等価のコマンドは以下のようになります.

 
find bills -type f -exec sort -o '{}.sorted' '{}' ';'


3.3.3 問い合わせ

ユーザに単一のファイル上でコマンドを実行するかどうかを尋ねるため, `-exec'の代わりに,findのプライマリ`-ok'が使用可能です.

Action: -ok command ;
`-exec'に似ていますが(see section 3.3.1 単一のファイル),ユーザに(標準入力上で) 最初に尋ねます.応答が`y'や`Y'で始まらない場合,コマンドを実行 せず,偽を返します.

単一のコマンドで複数のファイルを処理する時,ユーザに問い合わせるため, xargsに以下のオプションを与えます.このオプションを使用する時,コ マンドの呼出毎に処理するファイルの数を制御することが役に立つと分かるでしょ う.

--interactive
-p
ユーザにそれぞれのコマンドラインを実行するかどうかプロンプトを表示し,端 末から1行読み込みます.応答が`y'や`Y'で始まる場合のみコマンド ラインを実行します.暗黙に`-t'が指定されます.


3.4 テストの追加

findの組み込みテストが調査しない,ファイルの属性の調査をすること が可能です.こうするために,findが出力したファイルリストへのフィ ルターとなるプログラムを実行するため,xargsを使用してください. xargsによって実行されるプログラムが行なう仕事を減らすため,リスト が少なくなるように,findの組み込みテストをできるだけ使用して下さ い.findの組み込みテストは,他のプログラムが実行するテストより速 く実行されるでしょう.

例えばここに,`/usr/local'ディレクトリツリー内のstripされていないバ イナリの,すべての名前を出力する方法があります.組み込みテストは,通常の ファイルでないものや,実行可能でないファイルで,fileを実行するこ とを避けます.

 
find /usr/local -type f -perm +a=x | xargs file | 
  grep 'not stripped' | cut -d: -f1

cutプログラムは,fileの出力からファイル名以降のものすべて を削除します.

findの式の中間のどこかで特殊な調査を配置したい場合,調査を実行す るプログラムを実行するために,`-exec' を使用することが可能です. `-exec'は,実行されたプログラムの終了ステータスを評価するので,特殊 な属性を検査するプログラム(それは,シェルスクリプトも可能です)を書くこと と,真(ゼロ)や偽(ゼロ以外)のステータスで終了させることが可能です.そのよ うな特殊なテストは,新しいプロセスを開始し,組み込みテストが偽と評価する 場合は行なわないので,それを組み込みテストの後で配置することは良 い考えです.それぞれのファイルを調査するために,一つ以上の新しいプロセス を開始することは,多くのファイルの調査を一つのプロセスで開始する xargsの使用より遅くなるので,この手法は,xargsの柔軟性が十 分でない時にのみ使用して下さい.

以下は,引数がstripされているバイナリファイルかどうかを調査する, unstrippedという名前のシェルスクリプトです.

 
#!/bin/sh
file $1 | grep 'not stripped' > /dev/null

このスクリプトは,シェルが実行した最後のプログラムのステータスで終了する という事実に依存し,この場合grepになります.grepは,あらゆ る一致が見つかる場合は真で終了し,それ以外では偽で終了します.ここに(サー チパスにあると仮定している)スクリプトを利用している例があります.それは, ファイル`sbins'内のstripされている実行形式と,`ubins'内のstrip されていない実行形式をリストアップします.

 
find /usr/local -type f -perm +a=x \
  \( -exec unstripped '{}' \; -fprint ubins -o -fprint sbins \)


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on January, 21 2003 using texi2html