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

4. 一般的な作業

以下のセクションには,これらのプログラムの能力を利用する際の良い考えを 与え,一般的な現実問題を解説する方法を提示している,拡張された例を含ま れています.


4.1 閲覧と編集

特定の基準を満たすファイルのリストを見るために,引数にファイル名を用い て,単純にファイルビューアープログラムを実行します.シェルは,バックク オートで囲まれたコマンドを,その出力に置換するので,コマンド全体は以下 のようになります.

 
less `find /usr/include -name '*.h' | xargs grep -l mode_t`

ファイルビューアープログラムの代わりにエディタの名前を与えることで,こ れらのファイルを編集することも可能です.

 
emacs `find /usr/include -name '*.h' | xargs grep -l mode_t`

コマンドラインには個別の長さに制限があるので,この方法で処理されるファ イル数には制限があります.以下のようにxargsを使用することで, この面倒なことを回避します.

 
find /usr/include -name '*.h' | xargs grep -l mode_t > todo
xargs --arg-file=todo emacs

これで,xargsはファイル`todo'にリストアップされているすべて のファイルに必要な回数,emacsを実行します.


4.2 アーカイブ

findで生成したファイルリストを,ファイルアーカイブプログラムに渡 すことも可能です.GNU tarcpioは,どちらも標準入力からファ イル名のリストを読み込むことが可能です--ヌル(安全な方法),または,空白 (簡単だが危険なデフォルトの方法)のどちらかで分離します.ヌルで名前を分 離する方法を使用するため,`--null'オプションを与えてください.ファ イルアーカイブをファイルに保存したり,テープに書き出したり,ネットワー ク越しの他のマシンに展開したりすることも可能です。

ファイルをアーカイブする一般的なfindの使用方法は,ディレクトリツ リー内のファイルリストをcpioに送る方法です.所有者がディレクトリ に書き込み権限が無い場合は`-depth'を使用し,(その場合)ディレクトリ の権限はそのコンテンツのリストア後にリストアされるため,そのコンテンツ をアーカイブからリストアすることが可能です.こうするためにcpio使 用した例がここにあります.特定のファイルのみアーカイブするために,より 複雑なfindの式を使用することも可能です.

 
find . -depth -print0 |
  cpio --create --null --format=crc --file=/dev/nrst0

以下のコマンドを使用して,そのアーカイブをリストアすることが可能です.

 
cpio --extract --null --make-dir --unconditional \
  --preserve --file=/dev/nrst0

同じことをtarを使用して行なうコマンドは以下のようになります.

 
find . -depth -print0 |
  tar --create --null --files-from=- --file=/dev/nrst0

tar --extract --null --preserve-perm --same-owner \
  --file=/dev/nrst0

一つのマシンから他のマシンに,ディレクトリをコピーする例は以下のように なります.

 
find . -depth -print0 | cpio -0o -Hnewc |
  rsh other-machine "cd `pwd` && cpio -i0dum"

4.3 クリーンアップ

このセクションでは,さまざまな状況で,不要なファイルを削除する例を提供 します.マージの要求で更新された時に作成されるCVSバックアップファイルを 削除するコマンドは以下のようになります.

 
find . -name '.#*' -print0 | xargs -0r rm -f

上記のコマンドは動作しますが,以下のものがより安全です.

 
find . -name '.#*' -depth -delete

`/tmp'内のゴミファイルをきれいにするためにこのコマンドを実行するこ とが可能です.ログアウトする時にシェルがそれを実行するよう,(使用してい るシェルに依存しますが,`.bash_logout',`.logout',または `.zlogout')ファイルに書き出すことも可能です.

 
find /tmp -depth -user "$LOGNAME" -type f -delete 

findコマンドでディレクトリを削除する場合,findが削除され たディレクトリの再帰的な削除を試みるとき,偽りのエラーメッセージを見る かもしれません.`-depth'オプションを使用することで,通常この問題は 解決されます.

古いEmacsのバックアップファイルと自動保存ファイルを削除するために,以下 のようなコマンドが使用可能です.VMメーラーのようなEmacsパッケージは, `#reply to David J. MacKenzie<1>#'のようにスペースを含む一時ファイ ルを作成することが多いので,ヌルで終端されているファイル名を使用する方 法は,この場合には特に重要です.

 
find ~ \( -name '*~' -o -name '#*#' \) -print0 |
  xargs --no-run-if-empty --null rm -vf

`/tmp'から古いファイルを削除するため,通常はcronから実行し ます.

 
find /tmp /var/tmp -not -type d -mtime +3 -delete
find /tmp /var/tmp -depth -mindepth 1 -type d -empty -delete

上記の二番目のfindコマンドは,空のディレクトリの最初の深度をきれ いにするため`-depth'を使用し,それで親が空になり,削除も可能になる ことを期待しています.全体が空になった場合,`/tmp'自身を削除しない ように,`-mindepth'を使用しています.


4.4 奇妙なファイル名

findは,名前に奇妙な文字を含むファイルを,削除したり名前を変更し たりする手助けにもなります.スペース,タブ,制御文字,またはハイビット セットを用いた文字のような,もの(文字)を含む名前のファイルに邪魔される ときもあります.そのようなファイルを削除する最も簡単な方法は,以下のよ うになります.

 
rm -i some*pattern*that*matches*the*problem*file

rmは,与えられたパターンにマッチするそれぞれのファイルを削除する かどうか尋ねます.古いシェルを使用している場合で,ファイル名にハイビッ トセットを用いた文字を含む場合には,この方法は動作しません.シェルはそ れを削除します.より信頼できる方法は,以下のようになります.

 
find . -maxdepth 1 tests -okdir rm '{}' \;

ここでのtestsは,ファイルをユニークに識別します.`-maxdepth 1'オプションは,findがあらゆるサブディレクトリのファイルを検索す ることで,時間を無駄にすることを妨げます.サブディレクトリが無い場合は 省略してもかまいません.問題のファイルをユニークに識別する良い方法は, そのinode番号を知ることです.以下のように使用します.

 
ls -i

制御文字を名前に含んでいるファイルがあって,そのinode番号が12345だと分 かったと仮定します.以下のコマンドは,それを削除するかどうか,プロンプ トを表示します.

 
find . -maxdepth 1 -inum 12345 -okdir rm -f '{}' \;

ファイル名が奇妙な文字列を含んでいて,出力時にスクリーンが駄目になるた め,尋ねられたくない場合は,`-okdir'の代わりに`-execdir'を使 用して下さい.

そうではなく,ファイルの名前を変更したい場合,rmの代わりに mvを使用することが可能です.

 
find . -maxdepth 1 -inum 12345 -okdir mv '{}' new-file-name \;

4.5 権限の修正

特定のディレクトリツリーのディレクトリに,誰でも書き込めることを確実に したいと仮定します.ユーザまたはグループ(または両方)の権限が無く,それ らの権限を修正する方法は以下のようになります.

 
find . -type d -not -perm -ug=w | xargs chmod ug+w

ディレクトリが誰でも書き込めないことを確実にしたい場合,反対の処 理も可能でしょう.


4.6 ファイルの分類

ファイルの集合を異なる基準でいくつかのグループに分類したい場合,ファイ ル上で複数の独立したテストを実行するため,カンマオペレータを使用するこ とが可能です.例えば以下のようにします.

 
find / -type d \( -perm -o=w -fprint allwrite , \
  -perm -o=x -fprint allexec \)

echo "Directories that can be written to by everyone:"
cat allwrite
echo ""
echo "Directories with search permissions for everyone:"
cat allexec

findは,ディレクトリツリー全体を一度走査する必要があるだけです (それはその作業で最も時間がかかる部分の一つです).


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

This document was generated by Akihiro Sagawa on September, 28 2005 using texi2html 1.70.