SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

業務でラクするためのUNIXテクニック集

find/grep/xargsコマンドを使いこなす
業務で楽するためのUNIXテクニック集「検索」編

第1回


  • X ポスト
  • このエントリーをはてなブックマークに追加

findコマンドを利用した便利なUNIXテクニック例

 最後に、findコマンドを利用したいくつかの例を紹介しておきます。なお、ここに紹介した書き方以外にも、様々な書き方があります。業務に合わせて応用しながら利用してください。

core、#*、*~を一括削除する

 Emacsを利用していると、テキストを保存する際に「ファイル名~」、ファイルを編集する際に「#ファイル名#」というバックアップファイルが作成されます。また、Unix・Linuxプロセスが異常終了すると「core」ファイルが生成されます。これらのファイルを一度に削除したい場合には、次のように指定できます。

$ find . \( -name core -o -name '#*' -o -name '*~' \) -exec rm '{}' +

 「\(」と「コマンド」、「コマンド」と「\)」の間にはスペースを空ける必要があります。

 xargsコマンドを利用する場合は、次のように指定できます。

$ find . \( -name core -o -name '#*' -o -name '*~' \) -print0 | xargs -0 rm

 findコマンドの判別式「-o」は、「-or」でも構いません。

 なお、findコマンドの「-delete」アクションが利用できる場合は、次の方法が最も高速です。

$ find . \( -name core -o -name '#*' -o -name '*~' \) -delete

ユーザーが所有するファイルのみを検索して削除する

$ find . -type f -user $(whoami) -exec rm '{}' +

 xargsコマンドを利用する場合は、次のように指定できます。

$ find . -type f -user $(whoami) -print0 | xargs -0 rm

 whoamiコマンドは、ユーザ名を表示します。

検索して見つかった全ファイルを移動する

 検索して見つかった全ファイルを「/var/tmp/」以下に移動します。

$ find . -type f -print0 | xargs -0 mv -t /var/tmp/

 mvコマンドの「-t」または「--target-directory」オプションで、移動先ディレクトリを指定できます。なお、この例ではディレクトリ構造を維持せず、ファイルのみ移動します。同名のファイルが存在すると上書きされるなど期待通りに動かないため、注意が必要です。

※注4

 xargsコマンドに「-i」(FreeBSDでは「-I」)オプションをつけると、パイプで渡された結果を「{}」で展開できます。このため、次の指定方法でも動作します。

$ find . -type f -print0 | xargs -0 -i mv '{}' /var/tmp/

 FreeBSDの場合、デフォルトで「{}」で展開できないため、次のように指定します。

$ find . -type f -print0 | xargs -0 -I % mv % /var/tmp/

 「-I」オプションの後の文字(例では「%」)を、findコマンドで見つかったファイル名に置換しています。

 ただしこの方法は、1ファイルづつmvコマンドを実行するため、処理が遅くなります。

※注5

 FreeBSDでは、xargsコマンドの「-J」オプションを利用すると、「-I」オプションより高速に処理できます。

$ find . -type f -print0 | xargs -0 -J % mv % /var/tmp/

 この例では、検索して見つかったファイル名のグループを「%」に置き換えてmvコマンドを実行しています。

検索して見つかった全ファイルをディレクトリ構造ごとコピーする

 検索して見つかった全ファイルを、ディレクトリ構造を保持したまま「/var/tmp/」以下にコピーします。これは、ファイル単位でバックアップを取る場合に、役に立ちます。ファイルのバックアップで利用するcpioコマンドを利用すると次のように指定できます。

$ find . -type f -print0 | cpio -pd0 /var/tmp/

 「-p」オプションは、ファイルを別のディレクトリにコピーします。「-d」オプションは、必要に応じてディレクトリを作成します。なお、cpioコマンドの「-0」オプションはGNUのcpioコマンド以外では使えません。

サイズと拡張子を条件にファイルを検索し、結果を別のファイルに書き込む

 「~/public_html」以下で、拡張子が「.gif」かつサイズが100Kバイト以上のファイルを探し、結果を「result.txt」ファイルに書き込みます。

$ find ~/public_html \( -name "*.gif" -a -size +100k \) -fprint result.txt

findコマンドの「許可がありません」を表示しない

 一般ユーザーで、ルートディレクトリや「/etc」ディレクトリなどを対象に検索すると「Permission denied」という警告メッセージが大量に表示されます。検索結果の一覧が警告メッセージに埋まってしまい、検索結果の確認が大変な場合には、次の方法で表示されなくなります。

$ find / -name user → 「user」を検索
find: /usr/src: Permission denied → 警告メッセージ
find: /usr/share/skel/MailBox: Permission denied → 警告メッセージ
find: /usr/obj: Permission denied → 警告メッセージ
(略)
/home/user

$ find / -name user 2>/dev/null
/home/user

 「2>/dev/null」を指定して、警告メッセージをヌルデバイスへ出力しています。

まとめ

 今回はfindコマンドやgrepコマンド、そしてxargsコマンドを利用した「ファイル・ファイル内容の検索」に関するテクニックを紹介しました。今回紹介したほかにも、awkやperlを利用することで、簡潔な指定や高速な処理が可能な場合もあります。

 次回以降も、テーマごとにUNIXテクニックを紹介していく予定です。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
業務でラクするためのUNIXテクニック集連載記事一覧

もっと読む

この記事の著者

保田和隆(ヤスダカズタカ)

Yasuda Kazutakaネットワーク関連の組み込みソフトウェア開発者。http://uguisu.skr.jp/Windows/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3279 2008/12/22 16:25

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング