いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.218 / 読者数:2072名

こんばんは、うすだです。

いよいよ明日から、新入社員の方々が入ってこられますね。

今年は、転職して2年目を迎えた私も、 新入社員教育の一部を担うことになりました。
そっち系の知識がほとんどないピュアーな方々を対象に、 Web系の言語の基礎を教えることになっています。

当メルマガでも、初心者マーク付の管理者の方々を対象にしていますが、 新人教育では、 さらにわかりやすく丁寧に説明することを徹底する必要がありそうです。
普通では考えられない、トンでもないことをやらかしたりするらしいですので、 なにが起こるか、今から楽しみ(?)にしています。

というわけで、私も、初心にかえって引き締めていきたいと思います。

特にひねりのない前フリですが、今回もはりきってまいりますよ。

今回のお題 - find を使いこなす

システム管理者は、日々様々なことを行う必要があります。

それらをすべて手動で行っていては、身体がいくつあっても足りません。
そのため、定型的な作業は自動化するなどして、 できるだけ管理者の負担を軽減する細工を施すことが求められます。

さて、システム管理者が行うべきことの中で、 ものすごくありがちなこととして挙げられるのが、 特定の条件に合うファイルに対して処理を行う、という作業です。

たとえば、古いバックアップファイルを消すとか、 セキュリティ上問題のある設定のファイルを洗い出すとか、です。

これを効率よく行うために使用されるのが、みなさまよくご存じの find コマンドです。

…が、なんか適当に指定したら動作している、 というアバウトな使われ方をしていることが多いように思います。 (そうでなかったらすみません…)

そこで今回は、find コマンドを基礎から学んでみたいと思います。

find コマンドのおさらい

find コマンドは、ある条件にマッチするファイルを検索し、 処理を行うためのものです。
ものすごくざっくりとした書式は、以下の通りです。

  find ディレクトリ... 条件... 処理...

ディレクトリも条件も処理も、省略もできれば複数指定もできます。

ディレクトリには、検索する対象を指定します。 指定したディレクトリの下すべてを検索します。省略すると、 カレントディレクトリ以下を対称とします。

条件には、検索する条件を指定します。ファイル名や種類、所有者、時刻情報、 パーミッションなど、様々な条件を複数指定できます。 省略するとすべてがマッチします。詳しくは後述します。

処理には、条件にマッチしたファイルに対する処理を指定します。表示や削除、 その他あらゆる処理を指定できます。省略するとパスの表示だけを行います。 詳しくは後述します。

というわけですので、引数なしで実行すると、 カレントディレクトリ以下のファイルをドバーンと表示します。

  $ find
  ダウンロード
  テンプレート
  デスクトップ
  ドキュメント
  ...後略....

条件の指定

ここでは、よく使うと思われる条件をご紹介します。

まずは、ファイル名です。「-name」とパターンを指定します。 パターンには「*」や「?」「[]」を指定できます。
たとえば、ファイル名の最後が「tgz」のファイルを表示するには、 以下のように指定します。

  $ find . -name \*tgz
  ./backup/etc-081122.tgz
  ./arc.tgz
  ./work/archive/unixbench-4.1.0.tgz
  ...後略...

そのまま「*」を指定するとシェルが展開してしまうため、「\」をつけています。

次に、所有者やグループです。 それぞれ「-user」や「-group」と名前を指定します。
たとえば、「named」グループのファイルを表示するには、以下のように指定します。

  $ find /etc -group named
  /etc/named.caching-nameserver.conf
  /etc/rndc.key
  /etc/sysconfig/named
  /etc/named.rfc1912.zones

お次は、ファイルの種類です。 「-type」と「f」「d」「l」「s」などのいずれかを指定します。それぞれファイル、 ディレクトリ、シンボリックリンク、ソケットを示します。
たとえばシンボリックリンクを表示するには、以下のように指定します。

  $ find /etc -type l
  /etc/alternatives/mta
  /etc/init.d
  /etc/rc0.d
  ...後略...

そして最後に、時刻です。ファイルには、ステータスが変更されたときの時刻、 中身が修正されたときの時刻、 アクセスされたときの時刻が情報として記録されています。 それらに対して「-ctime」「-mtime」「-atime」と時刻の条件を指定します。条件には、 日数を示す数値と、「+」「-」をその数値につけることもできます。
数値だけの場合は、現在の日から指定した日数前のものがマッチします。
たとえば、1日前に修正(生成)したファイルを表示するには、以下のように指定します。

  $ find . -mtime 1
  ./backup/etc-120331.tgz
  ./backup/usr-120331.tgz
  ./backup/home-120331.tgz
  ...後略...

指定した日数より前のファイルを指定するには、日数の前に「+」をつけます。
たとえば、2日以上前に修正したファイルを表示するには、以下のように指定します。

  $ find . -mtime +1
  ./backup/etc-120330.tgz
  ./backup/etc-120329.tgz
  ...後略...

指定した日数より後のファイルを指定するには、日数の前に「-」をつけます。
たとえば、1週間以内に修正されたファイルを表示するには、以下のように指定します。 (1週間以内 == 8日前よりも新しい)

  $ find . -mtime -8
  ./backup/etc-120402.tgz
  ./backup/etc-120401.tgz
  ...中略...
  ./backup/etc-1203.tgz
  ...後略...

アクションの指定

同様に、よく使うと思われるアクションをご紹介します。

まずは、パスを表示するだけの「-print」です。 アクションを指定しないときもこれが指定されたことになります。

  $ find . -print
  .
  ./backup
  ./backup/120402.tgz
  ...後略...

他にも「-print0」「-ls」「-printf」などがありますが、ここでは割愛します。
(実際に指定して、表示を確認してみてください。)

ファイルを消すには、「-delete」を指定します。
たとえば、1週間以上前のファイルを削除するには、以下のように指定をします。

  $ find . -mtime +6 -delete

「-exec」と処理内容を指定すると、ほぼなんでもできちゃいます。
たとえば、3日以上前に修正されたファイルに対し、file コマンドを実行したい場合は、 以下のように指定します。

  $ find . -mtime +2 -exec file {} \;

ファイル名を引数に指定する場合、その箇所に「{}」を指定します。
また、「-exec」の引数は可変長のため、 引数の終わりを示す「;」を最後に指定する必要があります。 (これもシェルの解釈を逃れるため、「\」をつけています。)

おわりに

以上、find コマンドの基本的な使い方をご紹介しました。

あらためて find コマンドのオンラインマニュアルを見てみると、 昔からあるオプションはもちろん使えますが、知らないオプションなどが増えており、 使い勝手がよくなっていることに気がつきました。

なにはともあれ、まずはお試し環境やディレクトリで実行してみるところから、 始めてみてください。

宿題の答え

前回の宿題は、

  データをZIPで暗号化したものをメールで送ってみましょう。

でした。

すでにZIPファイルがあれば、前回説明したように、 そのファイルを添付して送る以下のスクリプトを使えば、事足りてしまいます。

#!/usr/bin/perl
use MIME::Lite;
use Encode qw(encode from_to);
use strict;
use warnings;

my $message = 'パスワードは別途送ります。';
from_to($message, 'utf8', 'ISO-2022-JP');

my $msgs = MIME::Lite->new(
	From	=> '送信元メールアドレス',
	To	=> '宛先メールアドレス',
	Subject	=> encode('MIME-Header-ISO_2022_JP', '送ります'),
	Type	=> 'multipart/mixed'
);
$msgs->attach(
	Type	=> 'text/plain; charset=ISO-2022-JP',
	Data	=> $message,
	Encoding => '7bit'
);
$msgs->attach(
	Type	=> 'application/zip',
	Path	=> 'data.zip',
	Filename => 'data.zip',
	Disposition => 'attachment'
);
$msgs->send;

ですが、いつも同じファイルを送ることは、おそらくないですよね。
幸い、MIME::Lite では、以下のように、Path にコマンドを指定すると、 コマンドの実行結果である標準出力をデータとして受け取るという、 ありがたい機能が備わっています。
(その際は、ReadNow に 1 を指定する必要もあります。)

  Path => "コマンド 引数 |",
  ReadNow => 1,

これを利用して、前述のスクリプトを以下のように変更します。
引数にパスワードとファイルを指定すると、 指定したファイルを指定したパスワードでZIPで固めて暗号化し、メールで送ります。

#!/usr/bin/perl
use MIME::Lite;
use Encode qw(encode from_to);
use strict;
use warnings;

if ($#ARGV < 1) {
	print STDERR "Usage: $0 password files...\n";
	exit 1;
}

my $pass = shift;
my $message = 'パスワードは別途送ります。';
from_to($message, 'utf8', 'ISO-2022-JP');

my $msgs = MIME::Lite->new(
	From	=> '送信元メールアドレス',
	To	=> '宛先メールアドレス',
	Subject	=> encode('MIME-Header-ISO_2022_JP', '送ります'),
	Type	=> 'multipart/mixed'
);
$msgs->attach(
	Type	=> 'text/plain; charset=ISO-2022-JP',
	Data	=> $message,
	Encoding => '7bit'
);
$msgs->attach(
	Type	=> 'application/zip',
	Path	=> "zip -P $pass -r - " . join(" ", @ARGV) . " |",
	ReadNow => 1,
	Filename => 'data.zip',
	Disposition => 'attachment'
);
$msgs->send;

zip コマンドを -P オプション付きで実行するなど、やや微妙なところもありますが、 あくまでも参考例ということでご容赦くださいませ。

今回の宿題

今回の宿題は、

  カレントディレクトリ以下で、1週間以上前に修正された、ファイル名
  が「backup」で始まるファイルをすべて削除してください。

です。

条件が複数の場合について、説明を失念していました。
オンラインマニュアル(man find)などで調べて、やってみてください。

あとがき

というわけで、というわけでもないのですが、本日、42歳になりました。

若い若いと言われていたのに、いつの間にか立派なおっさんです。
…いえ、35歳を過ぎたあたりから、すでにおっさんになっていたはずですので、 単に自覚がなかっただけだと思います。はい。

で、今日は、たまたま、実家の両親のところへ一家で訪れていました。
さらに年を重ねた両親と、中年に両足を突っ込んだわれわれ夫婦、 そしてこれから前途洋々の高校生になった息子、の3世代が集まり、 あれこれと楽しく話をしてきました。

とりとめのない話を延々としてきたのですが、 そんな中で無理やりひねり出された結論が、 「上手に年をとるのは難しい」ということでした。

これを勝手に意訳すると、「いくつになっても、 先のことを考えて計画的に行動する必要がある」ということではないか… と思い至りました。

私の場合、年金をあてにできない世代ですので、 定年を向かえてから死ぬまでの間の経済的なところが、 もっとも大きな問題といえます。
そのため、死ぬまで自分たちの力で食べていけるようにと、 ネガティブに考えがちになってしまいます。

ですが、どうせなら、死ぬ瞬間まで社会に貢献し続けたいと、 ポジティブな考えで生きていきたいです。
そのために、今後どうしていくべきなのか、5年後10年後はどうあるべきなのか、 計画的にやっていく必要があると、痛烈に思いました。

そして、息子には、悔いのない高校生活や大学生活が送れるよう、 自分で考えて行動できるようになって欲しいと思っています。
そのためにはどうサポートしていけばよいのか、 ということも併せて熟考する必要があると、思い至っています。

 

…ああ、考えることが苦手な私ですが、こればかりは先延ばしにできないテーマです。 よめなど周囲の人を巻き込んで、考えたいと思います。

読者のみなさまは、おそらく私より若い方々ばかりだと思います。
無計画でいるとこうなってしまいますよ、という反面教師を目の当たりにして、 計画的に人生を謳歌するよう考えていただけますと、幸いです。

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、4月15日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 読者の方から祝福されると超うれしい、本日でした。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本