[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
以下のセクションは,これらのプログラムの能力に利用する際の良い考えを与え, 一般的な現実問題を解説する方法を提示している,拡張された例を含みます.
4.1 閲覧と編集 | ||
4.2 アーカイブ | ||
4.3 クリーンアップ | ||
4.4 奇妙なファイル名 | ||
4.5 許可の修正 | ||
4.6 ファイルの分類 |
特定の基準を満たすファイルのリストを見るために,引数にファイル名を用いて, 単純にファイルビューアープログラムを実行してください.シェルは,バックク オートで囲まれたコマンドを,その出力に置換するので,コマンド全体はこのよ うになります.
less `find /usr/include -name '*.h' | xargs grep -l mode_t` |
ファイルビューアープログラムの代わりにエディタの名前を与えることで,これ らのファイルを編集することも可能です.
find
で生成したファイルリストを,ファイルアーカイブプログラムに渡
すことも可能です.GNU tar
とcpio
は,どちらも標準入力からファ
イル名のリストを読み込むことが可能です---ヌル(安全な方法),または,空白
(簡単だが危険なデフォルトの方法)のどちらかで分離します.ヌルで名前を分離
する方法を使用するため,`--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" |
このセクションでは,さまざまな状況で,不要なファイルを削除する例を提供し ます.マージの要求で更新された時に作成される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'を使用します.
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 \; |
特定のディレクトリツリーのディレクトリに,誰でも書き込めることを確実にし たいと仮定します.ユーザまたはグループ(または両方)の許可が無く,それらの 許可を修正する方法がここにあります.
find . -type d -not -perm -ug=w | xargs chmod ug+w |
ディレクトリが誰でも書き込めないことを確実にしたい場合,反対の処 理も可能でしょう.
ファイルの集合を異なる基準でいくつかのグループに分類したい場合,ファイル 上で複数の独立したテストを実行するため,カンマオペレータを使用することが 可能です.例えば以下のようにします.
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] | [ ? ] |