[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
以下のセクションには,これらのプログラムの能力を利用する際の良い考えを 与え,一般的な現実問題を解説する方法を提示している,拡張された例を含ま れています.
4.1 閲覧と編集 | ||
4.2 アーカイブ | ||
4.3 クリーンアップ | ||
4.4 奇妙なファイル名 | ||
4.5 権限の修正 | ||
4.6 ファイルの分類 |
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
特定の基準を満たすファイルのリストを見るために,引数にファイル名を用い て,単純にファイルビューアープログラムを実行します.シェルは,バックク オートで囲まれたコマンドを,その出力に置換するので,コマンド全体は以下 のようになります.
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
を実行します.
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
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 |
上記のコマンドは動作しますが,以下のものがより安全です.
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’を使用しています.
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
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 \; |
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
特定のディレクトリツリーのディレクトリに,誰でも書き込めることを確実に したいと仮定します.ユーザまたはグループ(または両方)の権限が無く,それ らの権限を修正する方法は以下のようになります.
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
は,ディレクトリツリー全体を一度走査する必要があるだけです
(それはその作業で最も時間がかかる部分の一つです).
[ << ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
この文書は新堂 安孝によって2009年9月22日にtexi2html 1.82を用いて生成されました。