[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
find
の式で与えた基準に一致するファイルの情報を出力する方法が,い
くつかあります.標準出力または指名したファイルに,情報を出力することが可
能です.ファイル名を引数として,コマンドを実行することも可能です.これら
のコマンドを,選択したファイルへのフィルターとして以外でも使用することが
可能です.
3.1 ファイル名の出力 | ||
3.2 ファイル情報の出力 | ||
3.3 コマンドの実行 | ||
3.4 テストの追加 |
find
の実行時にfileが存在しない場合は作成されます.存在する
場合は0バイトに切り詰められます.ファイル名`/dev/stdout'と
`/dev/stderr'は,特別な扱いをされます.それらはそれぞれ,標準出力と
標準エラー出力を参照します.
204744 17 -rw-r--r-- 1 djm staff 17337 Nov 2 1992 ./lwall-quotes |
フィールドは以下のとおりです.
POSIXLY_CORRECT
が設定されていない場合,1Kブロック単位で
す.サイズを元にしたファイルの検索方法は,See section 2.4 サイズ.
printf
の用に
指定可能です.`-print'とは異なり,`-printf'は文字列の終りに改
行を追加しません.
3.2.1 エスケープ | ||
3.2.2 書式指示語 | ||
3.2.3 時間の書式 |
`-printf'と`-fprintf'で認識されるエスケープは以下のとおりです.
\a
\b
\c
\f
\n
\r
\t
\v
\\
`\'文字に他の文字が続くものは,通常の文字として扱われるので,両方が 出力され,(おそらくそれは入力ミスなので)標準エラー出力に警告メッセージが 出力されます.
`-printf'と`-fprintf'は,処理しているファイルに関する情報を出
力するため,以下の書式指示語をサポートします.Cのprintf
関数と異な
り,それらはフィールド幅の指定をサポートしていません.
`%%'はパーセント記号そのものです.他の文字が続く`%'文字は削除 され(が,それ<%>以外の文字は出力され),(おそらく入力ミスのため)標準出力 に警告メッセージが出力されます.
3.2.2.1 名前指示語 | ||
3.2.2.2 所有者指示語 | ||
3.2.2.3 サイズ指示語 | ||
3.2.2.4 位置指示語 | ||
3.2.2.5 時間指示語 |
%p
%f
%h
%P
%H
%g
%G
%u
%U
%m
%k
%b
%s
%d
%F
%l
%i
%n
これらの指示語にはCのctime
関数を使用するものもあります.その出力
は現在のロケールに依存しますが,典型的なものは以下のようになります.
Wed Nov 2 00:42:36 1994 |
%a
ctime
関数で返される書式での,ファイルの最後にアクセスされた時
間.
%Ak
%c
ctime
関数で返される書式での,ファイルの最後にステータスが変更
された時間.
%Ck
%t
ctime
関数で返される書式での,ファイルの最後に編集された時間.
%Tk
以下は,指示語`%A',`%C',そして`%T'に対する書式で,それ
はファイルのタイムスタンプを出力します.これらの書式には,Cの
strftime
関数のシステム間での違いにより,すべてのシステムで利用可
能でないものもあります.
3.2.3.1 時間の内容 | ||
3.2.3.2 日付の内容 | ||
3.2.3.3 時間の書式の組み合わせ |
以下の書式指示語は,時間の単一の内容を出力します.
H
I
k
l
p
Z
M
S
@
以下の書式指示語は,日付の単一の内容を出力します.
a
A
b
h
B
m
d
w
j
U
W
Y
y
以下の書式指示語は,時間と日付の組み合わせを出力します.
r
T
X
c
D
x
find
やlocate
で作成されたファイル名のリストを,他のコマンド
への引数として使用可能です.この方法で,ファイルへの任意の動作を実行する
ことが可能です.
3.3.1 単一のファイル | ||
3.3.2 複数のファイル | ||
3.3.3 問い合わせ |
ここに一つのファイルへのコマンドを,一度に実行する方法があります.
find
は,`-exec'以降のすべての引数を,`;'から成り立つ引
数に到達するまで,コマンドの部分として受けとります.それは,文字列
`{}'を現在のファイル名で置換し,コマンドにそれがある場所で処理さ
れます.これらの構文はどちらも,シェルによる展開を防ぐために(`\'を
用いて)エスケープしたり,引用符で囲む必要があります.コマンドは,
find
を実行しているディレクトリで実行されます.
例えば,現在のディレクトリのそれぞれのCのヘッダファイルを,ファイル `/tmp/master'と比較するために以下のようにします.
find . -name '*.h' -exec diff -u '{}' /tmp/master ';' |
単一のファイルを処理する必要がある時もあります.しかし,それができない時, ファイル毎にコマンドを実行するより,できるだけ多くのファイルをコマンドで 実行した方が速くなります.これを行なうことで,それぞれのコマンドを開始す る時間を稼ぐことになります.
一度に一つ以上のファイルをコマンドで実行するために,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 ファイル名をばらまく |
ファイル名には,引用符,バックスラッシュ,空白文字,そして改行でさえ含め
ることが可能なので,処理のデフォルトモードで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 |
ここに,find
が出力したファイル名を,他のプログラムでめちゃくちゃ
にされたり誤解されたりしないで,他のプログラムで使用可能にする方法があり
ます.この方法で生成されたファイル名に,`-0'や`--null'オプショ
ンを,GNU xargs
,GNU tar
,GNU cpio
,または,
perl
に渡すことで,処理することが可能です.
xargs
で,それぞれの実行時にコマンドに渡す引数の数を制御することが
できます.デフォルトで,ARG_MAX
- 2k,または20kまでの小さい方を,
コマンド毎の文字として使用します.それは,制限以内のできるだけ多くの行と
引数を使用します.以下のオプションはこれらの値を変更します.
--no-run-if-empty
-r
--max-lines[=max-lines]
-l[max-lines]
--max-args=max-args
-n max-args
xargs
は終了します.
--max-chars=max-chars
-s max-chars
--max-procs=max-procs
-P max-procs
xargs
は可能な限り多くのプロセスを,一度
に実行します.`-P'とともに,`-n',`-s',または`-l'オ
プションを使用して下さい.そうしない場合,コマンドが実行される機会は,1
度しかありません.
xargs
は,処理するファイル名を,コマンドに対して与えた引数の間に挿
入可能です.コマンドの大きさを制限するオプションを与えていない場合
(see section 3.3.2.3 コマンドサイズの制限),このモードの処理は,`find -exec'と
等価です(see section 3.3.1 単一のファイル).
--replace[=replace-str]
-i[replace-str]
find bills -type f | xargs -iXX sort -o XX.sorted XX |
`find -exec'を使用した等価のコマンドは以下のようになります.
find bills -type f -exec sort -o '{}.sorted' '{}' ';' |
ユーザに単一のファイル上でコマンドを実行するかどうかを尋ねるため,
`-exec'の代わりに,find
のプライマリ`-ok'が使用可能です.
単一のコマンドで複数のファイルを処理する時,ユーザに問い合わせるため,
xargs
に以下のオプションを与えます.このオプションを使用する時,コ
マンドの呼出毎に処理するファイルの数を制御することが役に立つと分かるでしょ
う.
--interactive
-p
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] | [ ? ] |