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

4. 一般的な作業

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

4.1 閲覧と編集  
4.2 アーカイブ  
4.3 クリーンアップ  
4.4 奇妙なファイル名  
4.5 許可の修正  
4.6 ファイルの分類  


4.1 閲覧と編集

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

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

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


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

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

 
find /tmp -user $LOGNAME -type f -print0 | xargs -0 -r rm -f

古い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 -print0 |
  xargs --null --no-run-if-empty rm -f

find /tmp /var/tmp -depth -mindepth 1 -type d -empty -print0 |
  xargs --null --no-run-if-empty rmdir

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


4.4 奇妙なファイル名

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

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

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

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

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

 
ls -i

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

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

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

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

 
find . -maxdepth 1 -inum 12345 -ok 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は,ディレクトリツリー全体を1度走査する必要があるだけです(そ れはその作業で最も時間がかかる部分の一つです).


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

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