- PR -

シェルスクリプト作成

投稿者投稿内容
一紋
会議室デビュー日: 2006/01/19
投稿数: 13
投稿日時: 2006-07-18 15:36
お世話になります。シェルスクリプトについて質問させて頂きます。
毎日AM8:00に/var/log以下にある前日の更新日付のファイルだけを
/var/move以下にコピーするシェルスクリプトを作成したいのですが
どのように書けばよいのでしょうか?linuxを触ってまだ日が浅いので
なかなかうまく書く事ができません・・・
ご存知の方、ご教授下さいますようよろしくお願い致します。


OS:Redhat AS v3
あるかな
大ベテラン
会議室デビュー日: 2003/11/04
投稿数: 245
投稿日時: 2006-07-18 16:39
こんにちは。

全てを書いてしまうと勉強にならないと思うので、ヒントだけ。

時間指定での実行には cron を利用します。
前日日付のファイルの選定ですが、いくつか方法があります。
1.find コマンドのオプション -mmin や -mtime など。詳細は man で。
2.ls コマンドの出力結果を awk で切り取って比較。など。

ただ、仰っているロジックだと、ファイル名の重複が発生してしまうと思います。
一紋
会議室デビュー日: 2006/01/19
投稿数: 13
投稿日時: 2006-07-19 15:26
ご回答ありがとうございます。
ヒントを頂いたfindコマンドのオプションで以下のコマンドを入力したのですが、
"前日の更新日付のみ"のファイルがうまく検索できません。

find /var/log -mtime 0
実行結果:本日の更新日付ファイルと前日の更新日付ファイルが返されます

find /var/log -mtime 1
実行結果:2日前の更新日付ファイルのみ返されます

前日の更新日付のみの検索結果を返すようにするにはどうすればよいのでしょうか?
あと、検索結果のリストを/var/moveに移動させたいのですが、その際は
find /var/log -mtime 1 -exec cp /var/move
ではダメなのでしょうか?missing argument to 'exec'とエラーが出てしまいます。

どうかご教授くださいますようお願い致します。
あるかな
大ベテラン
会議室デビュー日: 2003/11/04
投稿数: 245
投稿日時: 2006-07-19 17:05
man の解説を注意深く見ていただくとわかるのですが、
-mtime は「ファイルのデータが最後に修正されたのが n*24 時間前なら真。」
となります。
なので、ほぼ厳密な”前日”日付を対象にしたい場合は、
実行タイミングを日付変更に合わせなければなりません。
#ロジックを作成する場合、そこら辺の運用を含めて。。。という感じです。

(いつ実行などと限定せずに)汎用性を持たせた作りであれば、
後者の ls 結果の加工も考えられます。
#他の識者の方はもっとスマートな方法を思いつくかもしれません。

ちなみに -mtime の結果はこんな感じです。
-exec を利用される場合は、

find /var/log -mtime 1 -exec cp {} /var/move/ \;

となると思います。
{} がヒットしたファイル名に置き換わり、
\; で -exec 中に記載したコマンドの終わりを宣言します。

> date
2006年07月19日 (水) 16時52分15秒 JST
> find /var/adm/ -name 'message*' -type f -mtime 0 -exec ls -l {} \;
-rw-r--r-- 1 root other 538 7月 19日 11:32 /var/adm/messages
-rw-r--r-- 1 root other 1431 7月 19日 02:30 /var/adm/messages.0
> find /var/adm/ -name 'message*' -type f -mtime 1 -exec ls -l {} \;
-rw-r--r-- 1 root other 988 7月 18日 02:30 /var/adm/messages.1
> find /var/adm/ -name 'message*' -type f -mtime 2 -exec ls -l {} \;
-rw-r--r-- 1 root other 988 7月 17日 02:30 /var/adm/messages.2
> find /var/adm/ -name 'message*' -type f -mtime 3 -exec ls -l {} \;
-rw-r--r-- 1 root other 988 7月 16日 02:30 /var/adm/messages.3
> find /var/adm/ -name 'message*' -type f -mtime 3 -exec ls -l {} \;
-rw-r--r-- 1 root other 988 7月 16日 02:30 /var/adm/messages.3
anights
ぬし
会議室デビュー日: 2003/05/22
投稿数: 277
お住まい・勤務地: 東京
投稿日時: 2006-07-20 00:11
引用:

あるかなさんの書き込み (2006-07-19 17:05) より:
man の解説を注意深く見ていただくとわかるのですが、
-mtime は「ファイルのデータが最後に修正されたのが n*24 時間前なら真。」
となります。
なので、ほぼ厳密な”前日”日付を対象にしたい場合は、
実行タイミングを日付変更に合わせなければなりません。
#ロジックを作成する場合、そこら辺の運用を含めて。。。という感じです。


-daystartオプションを使うのも手ですよねー。
_________________
桃李不言 下自成蹊
あるかな
大ベテラン
会議室デビュー日: 2003/11/04
投稿数: 245
投稿日時: 2006-07-20 08:47
引用:

anightsさんの書き込み (2006-07-20 00:11) より:
-daystartオプションを使うのも手ですよねー。



アリというか、それで解決しますね...orz
私も man の熟読不足で、失礼しました。

ご参考までに Solaris の man に記載が無く使えず、
CentOS の man には記載が有り使えました。
なので、一紋様の環境では使えると思うので、
そちらを使用した方が簡単ですね。
一紋
会議室デビュー日: 2006/01/19
投稿数: 13
投稿日時: 2006-07-21 16:34
あるかな様、anight様 素早い回答ありがとうございました。
以下のコマンドで前日更新日分のファイルのみ検索及びコピーをすることが
出来ました。

find /var/log -daystart -mtime 1 -exec cp {} /var/move/ \\;

ここでまた質問なのですが、あるかな様が最初仰っていたように
これを毎日実行すると、ファイルの重複が発生してしまいます・・・
そこで日付別にフォルダを作成してそれに対応した日付のファイルを
コピーしていきたいのですが、その場合どのように書けばよいのでしょうか?
ヒントを頂けるとありがたいです。
anights
ぬし
会議室デビュー日: 2003/05/22
投稿数: 277
お住まい・勤務地: 東京
投稿日時: 2006-07-21 17:13
引用:

ヒントを頂けるとありがたいです。



前日日付はYYYYMMDD形式が良いでしょうね。桁が決まっているし。
以下のような感じで取得出来ます。
ただ、-dのオプションのくだりは他のOSでは使えなかったりするので
注意が必要ですが。

$ date -d yesterday +%Y%m%d

_________________
桃李不言 下自成蹊

スキルアップ/キャリアアップ(JOB@IT)