こんにちは、UNIX上で行うファイル比較とWindowsとのファイル連携について
わからない事があり、ご教示頂きたく投稿致します。


毎日1回、テキストファイルを比較してもし差分があれば
管理者に解る形で抽出させる、という処理を行いたいのです。

環境は以下の通りです。

192.168.1.0/24のセグメント内のあるWindows2003Serverにおいて、
比較対象のファイル(AAAA.txtとする)は以下の場所に日々保存される。

例えば2005年4月1日には

C:\Switch\configs\2005\04\01

というディレクトリ配下にAAAA.txtが作成される。
4月2日ならばC:\Switch\configs\2005\04\02配下にAAAA.txtが作成される。

当日のAAAA.txtと前日のAAAA.txtを比較抽出する処理を、毎日自動で行いたい。

例えば2005年4月10日だと
C:\Switch\configs\2005\04\10配下のAAAA.txtと
C:\Switch\configs\2005\04\09配下のAAAA.txtを比較することになる。

そして比較抽出を処理するのはUNIX端末(そのWindowsサーバと同セグメント)である。


ポイントは、

・比較したいファイルの場所(ディレクトリ)が日々、日付によって変動する
・そのファイルはWindows2003Serverが稼動しているサーバ内にある
・そのファイルをUNIX(例えばBSD)が稼動している端末から参照し、
 毎日任意の時間に比較・抽出したい

というところかと思うのですが、どういう手段がベストでしょうか。

UNIXに疎い私なりに調べたところ、
diffとsortコマンド、そして「samba」と「クーロン」というツールがあれば
可能かと思うのですが、如何でしょうか。

スクリプトをどう書くかなど、具体的な手法をご教示頂ければ幸いです。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

(1)unixからWindowsのフィルをアクセスする方法


案1:Windowsでftpサーバーを動かして、unix上でftpコマンドで取得する
案2:Windowsでフォルダに共有設定して、unix上でsmbclientコマンドで取得する

(2)ディレクトリ名が日によって違う
FILE=`date +%Y/%m/%d/AAAA.txt`
のようにファイル名をセットできる。前日日付は、linuxのdateなら -d '1 day ago' をつけて、
OLDFILE=`date +%Y/%m/%d/AAAA.txt -d '1 day ago'`
FreeBSDのdateなら -v -1d です。

(3)毎日任意の時間に
任意の時間であればそのときにコマンドをたたけばいいと思いますが、cronを書いているということは「毎日決まった時間に」の間違いでしょうか?
スクリプトを作ってから、crontab -e でcrontabファイルを編集して、例えば毎日3時0分にやりたければ
0 3 * * * スクリプト名
と書けばいいです。結果はメールで届きます。

ftpの場合のサンプルを書くと、
FILE=`date +/Switch/configs/%Y/%m/%d/AAAA.txt`
OLDFILE=`date +/Switch/configs/%Y/%m/%d/AAAA.txt -d '1 day ago'`
ftp -n WindowsHostName <<EOF
user username password
get $FILE today.txt
get $OLDFILE yesterday.txt
bye
EOF
diff yesterday.txt today.txt
    • good
    • 0
この回答へのお礼

さっそくのご回答ありがとうございました。
ここまでヒントを頂ければ十分応用が効きそうです。
またftpを利用することは考えていなかったので、これも並行して検討していきます。

お礼日時:2005/04/21 21:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qmysql_queryで取得したデータと外部のテキストファイルをマッチングしたい

mysqlに次のようなテーブルがあります。

テーブル名 : meibo

id | name
1 | 阿部
2 | 佐藤
3 | 橋本


そして次のようなテキストファイルがあります。

ファイル名 : blood.txt

1,A
2,B
3,O


テーブルのidとテキストファイルの数字を共通項として連携したいのですが可能でしょうか?

具体的には、phpファイルでmysqlからデータを取り出し、blood.txtとマッチングさせて表示したいと思っています。

例えば、次のように記述箇所がある場合、どこでblood.txtとマッチングすることができるでしょうか?

$rs = mysql_query("select * from meibo ;"$con);

while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){

echo $rec['name'];

//ここに血液型を表示させたい


}


それとも、そもそもこのようなことはできないのでしょうか?

よろしくお願いします。

mysqlに次のようなテーブルがあります。

テーブル名 : meibo

id | name
1 | 阿部
2 | 佐藤
3 | 橋本


そして次のようなテキストファイルがあります。

ファイル名 : blood.txt

1,A
2,B
3,O


テーブルのidとテキストファイルの数字を共通項として連携したいのですが可能でしょうか?

具体的には、phpファイルでmysqlからデータを取り出し、blood.txtとマッチングさせて表示したいと思っています。

例えば、次のように記述箇所がある場合、どこでblood.txtとマッチングするこ...続きを読む

Aベストアンサー

blood.txtを
$blood=Array(1=>'A',2=>'B',3=>'C');
となるよう配列に読み込んでおき

$rec['id']にidが入るのでそれをもとに
echo $blood[$rec['id']];
で表示できるでしょう

ていうか、血液型はSQLのテーブルで管理するのが普通の流れでしょうけど

QC:\WINDOWS\system32\drivers\etcの中身について

初歩的な質問ですが宜しくお願いいたします。

C:\WINDOWS\system32\drivers\etc

の中身に[hosts][lmhosts][networks][protocol][services]とあるのですが、それぞれの働きなどを分かりやすく説明いただければと思います。
宜しくお願いいたします。

Aベストアンサー

ぜんぜん初歩じゃないと思います。

hostsとlmhosts以外は私も知らなかったので、
それぞれのファイルに書いてある文書を読んで、解釈してみました。

・hosts
IPアドレスとホスト名(コンピュータ名)を関連付けます。
通信は基本的にIPアドレスで行いますが、人間からするとホスト名でアクセスした方がわかりやすいですね。
そこでホスト名→IPアドレスに変換する機能が必要になるのですが、これを行うのがhostsです。
「<IPアドレス><ホスト名>」と記入しておけば、
ホスト名で通信を開始したときに、hostsを見てIPアドレスに変換してくれます。
ちなみにDNSはhostsのでっかいのを持っていて、いろんなコンピュータからこの変換の問い合わせを受け付けてます。
(もの凄くはしょって説明しています。動的更新というのもありますし)
また、この変換のことを名前解決といいます。

・lmhosts
これもIPアドレスとコンピュータ名の関連付けです。
ただこちらで解決しているのは正確には「NetBIOS名」です。
Windowsで古くから使われているネットワークの方式にNetBIOSというのがあるのですが、
NetBIOSは大規模ネットワークに向かず、より大規模ネットワーク向けのプロトコルであるTCP/IPを組み込んだ
「NetBIOS over TCP/IP(NBT)」ができました。
ここでNetBIOSで使っていたNetBIOS名と、IPアドレスを関連付ける必要が出て、それに使用しているのがlmhostsです。
ちなみにhostで出た「DNS」みたいな名前解決の機能は、「WINS」というのがあります。

・networks
これはファイルの説明文を見ると、DNSで言うところの「逆引き」を行っているようですね。
hostsで触れた「ホスト名→IPアドレス」の名前解決は「正引き」と言います。
「逆引き」その名の通り逆で、「IPアドレス→ホスト名」の解決を行います。
このファイルの使い道がいまいち解りません・・・。

・protocol
これも説明文からです。
IEFTのRFC1700によって決められている、ネットワークプロトコルとその番号のようですが・・。
これも使われているのかな・・?

・services
またまた説明文からです(汗)。
これはIANAで決められている、各ネットワークプロトコルとのポート番号の関連付けのようです。
使っているのか不明です・・。

すみません「hosts」と「lmhosts」以外はろくな説明になってませんね。

参考URL:http://www.atmarkit.co.jp/fwin2k/win2ktips/442hostsfile/hostsfile.html

ぜんぜん初歩じゃないと思います。

hostsとlmhosts以外は私も知らなかったので、
それぞれのファイルに書いてある文書を読んで、解釈してみました。

・hosts
IPアドレスとホスト名(コンピュータ名)を関連付けます。
通信は基本的にIPアドレスで行いますが、人間からするとホスト名でアクセスした方がわかりやすいですね。
そこでホスト名→IPアドレスに変換する機能が必要になるのですが、これを行うのがhostsです。
「<IPアドレス><ホスト名>」と記入しておけば、
ホスト名で通信を開始したときに、...続きを読む

Qパワーポイント2007のテキスト一括抽出方法

パワーポイント2007を使用しています。全てのテキストボックスを選択した後、全てのテキストボックス内のすべてのテキストを一括抽出して、そのテキストをワードに貼りつけたいのですが、その抽出方法がわかりません。教えてください。

Aベストアンサー

テキストボックス内のテキストは"セクション"で囲われているため、そのままでは
コピペ(抽出も)できません。

一度パワーポイント側で、Webページとして保存してからブラウザで開いてみてください。
そうすればセクションが外れて、テキストのみコピーできると思います。
(ただし、書式情報は残りますので、ワードに貼り付けた後修正してください。)

ブラウザの種類、バージョンによっては直接開けたりもしますが、上記の方法であれば
確実です。

QC:\Documents and Settings配下のユーザディレクトリについて

C:\Documents and Settings配下に『administrator』という
ディレクトリがあるかと思いますが、
それ以外に、『administrator.xxxxxx』というフォルダが
何個もできています。
これは、何故できるのでしょうか?

Aベストアンサー

xxxxxxって具体的にどういった文字列が入っています?
直接見たケースだとドメイン名が入っているのはありますね。
例えばローカルにもドメインにもadministratorアカウントがあって
同じPCでローカルのadministratorでログオン、ドメインのadministratorでログオンすると
administrator
administrator.ドメイン名
みたいな感じでフォルダが出来ます。

ちょっと調べてみたら@ITに載っていましたので参考URLにはっておきます。
参考URL先で「プロファイル・フォルダ名の整理」を見てみてください。

参考URL:http://www.atmarkit.co.jp/fwin2k/win2ktips/386clearprof/clearprof.html

Qテキストボックスのグループ化の方法(word2003)

word2003を使用して名刺を作成しています。テキストボックスをグループ化したいのですが、shiftキーを使っても、複数のテキストボックスを選ぶことができません。方法を教えてください。

また、クリップアートとテキストボックスをグループ化する方法があれば、教えてください。

Aベストアンサー

Word2003のテキストボックスは「テキスト編集状態」と「描画オブジェクト状態」でボックスの外回りの縞模様が異なります。

で、グループ化するには、「描画オブジェクト状態」で複数選択する必要があります。
ボックスの枠線上にマウスポインタを持っていくと、「I」の形から十字矢印に変わりますので、十字矢印の状態でクリックしてください。(2個目以降は「Shift」キーを押しながらクリック。)

これができれば、クリップアートやワードアートとのグループ化もできるはずです。

Qpkg-config のPKG_CONFIG_PATHを設定するには?

$HOME/local/lib/pkgconfig
に .pcファイルがあるので

set PKG_CONFIG_PATH=$HOME/local/lib/pkgconfig
%pkg-config --exists glib-2.0

エラーになってしまいます。

%pkg-config --version
0.15.0


※root管理権限はありません。

Aベストアンサー

> set PKG_CONFIG_PATH=$HOME/local/lib/pkgconfig

setenv PKG_CONFIG_PATH $HOME/local/lib/pkgconfig

――では。シェル変数じゃなく、環境変数として設定するのだと思われます。

参考URL:http://www.is.noda.tus.ac.jp/text030397/text030397-1/node157.html

Qフォルダ名やファイル名、テキストドキュメント名のタイトルだけコピーする方法?

前から面倒でタイトルのようにフォルダ名やファイル名をコピーする方法
がないのかなと思っていたのですが、なにか良い方法はないでしょうか?
またテキストドキュメントもよく利用するのですが、そのままテキストドキュメントの
コピーではなくタイトルだけコピーして、別のテキストドキュメントのタイトルにタイトルだけ
コピーする方法はないのでしょうか?

よく、一部だけ変更して別のテキストドキュメントに保存するのですが
そうするとタイトルが長くなり、タイトルつけるだけでも結構面倒に
なるので、タイトルだけコピーしてタイトルを一部変更して
保存できれば楽だなと思ったのですが、なにか良い方法は
ないでしょうか?

つまり、新規テキストドキュメント>タイトル消す>別に作成したテキストドキュメントから
タイトルだけコピー>さっき消した新規テキストドキュメントのタイトルに貼り付け>
>タイトル一部変更保存>という流れでやりたいのですが。

応用してフォルダ名だけコピーファイル名だけコピーとかできれば面倒でなくなるのですが。

説明がわかりづらいと思いますが良い方法があれば回答よろしくお願いします。

前から面倒でタイトルのようにフォルダ名やファイル名をコピーする方法
がないのかなと思っていたのですが、なにか良い方法はないでしょうか?
またテキストドキュメントもよく利用するのですが、そのままテキストドキュメントの
コピーではなくタイトルだけコピーして、別のテキストドキュメントのタイトルにタイトルだけ
コピーする方法はないのでしょうか?

よく、一部だけ変更して別のテキストドキュメントに保存するのですが
そうするとタイトルが長くなり、タイトルつけるだけでも結構面倒に
なる...続きを読む

Aベストアンサー

[名前を付けて保存]ダイアログで、既存のファイルから[ファイル名]を
コピーしたいのですね。
以下で説明する私が使っている方法でよければ試してみてください。

[名前を付けて保存]→[名前を付けて保存]ダイアログにて保存をしたい
フォルダが開いた状態にする→[ファイル名]でカーソルが点滅した状態
でコピーしたいファイル名を右クリック→[ファイル名]に名前がコピー
されたら一部を変更して[保存]。

上記手順で右クリックしたときに右クリックメニューが表示されますが
そのまま[ファイル名]のところをクリックすれば消えますので変更する
部分だけ追加などをします。

Q正規表現 '\(.*\)\.' の意味

目的がファイル名から拡張子を取り除きたいのですが
expr `basename hoge.sh ` : '\(.*\)\.'
で標準出力の結果が hoge となり目的を達成する事ができました。
しかし  '\(.*\)\.' の意味がよく理解出来なくて悩んでおります。
色々と試してみた結果になりますが

expr `basename hoge.sh ` : '\(*\)\.'  .を取ってみた
出力無し

expr `basename hoge.sh ` : '\(.*\) .\を取ってみた
hoge.sh

expr `basename hoge.sh ` : '\(.*\).'  \を取ってみた
hoge.s

expr `basename hoge.sh ` : '\(...\)\.' ...にした
出力無し

expr `basename hoge.sh ` : '\(....\)\.' ....にした
hoge

以上、よろしくお願い致します。

Aベストアンサー

expr コマンドの 「expr 文字列 : 正規表現」書式で正規表現中で \( \) が使われていた場合は、それに囲まれた範囲が結果として出力されます。このことは、man expr で調べられます。

あとは、 . 任意の文字列、 * 直前の0回以上の繰り返し、 \. ピリオド文字
というのがわかれば、ピリオドの直前までの文字列を取り出すことがわかると思います。

また、拡張子が .sh だということがわかっていれば、
basename hoge.sh .sh
でhogeが得られます。

Qテキストデータを開いて指定したエクセルシートに貼り付ける方法

質問です。テキスト形式で保存したデータが約500あります。
以後
・テキストデータをテキスト1~テキスト500と呼びます
・貼り付けたいエクセルシートをシートと呼びます

1.まずテキスト1をエクセルで開きます
2.そしてエクセルで開いた、例えばB12~B18までのデータを
  シートのA1~A7に貼り付けます
3.次にテキスト2をエクセルで開き、今度はB12~B18までのデータを
  シートのB1~B7に貼り付けます
4.この作業を続けてテキストデータ500個を1つのエクセルシートに  順々に貼り付けていくにはどうすればいいでしょうか?

上記の操作において、エクセルで開いたテキストデータから抽出するデータの位置(アドレス?)はすべて同じです。上記の場合はB12~B18です。問題はエクセルシートに、テキストデータ1はA列に、2はB列に、3はC列にという様に貼り付けていく方法が知りたいです。
一つ一つやっているのですが、気が遠くなります。何かいい方法があればよろしくお願いします。

Aベストアンサー

マクロを使うと出来ます。

マクロが理解出来ているという前提で、お話しします。
(1)特定のファイルを特定の順序で開くには、
開くファイルを特定する為、それぞれのファイルのFullPathを取得する方法が必要です。
(2)開いたファイル別に列にコピーして貼り付けるためには、ファィルの数だけ列が必要ですが、エクセルシートの列の数は256で有限です。貼り付ける位置を再考する必要があります。
(3)コンピュータにとって、ファイルを開く(閉じる)という行為は、結構ハードな作業で、時間が掛かります。(作動速度の大きいコンピュータで作業する必要がある。)
(4)そのため、エクセルにはテキストファイルを開く時間を極小して開く方法が用意されていすが、この方法で開いたファイルから必要データを抽出して取得するプログラムが結構難しい。
(5)いろいろな問題があって、一筋縄ではありませんが、sdfaさんのやりたいことは、可能です。是非頑張って下さい。

QUNIX Cシェルで実数の比較

UNIX Cシェルで実数の比較がしたいのですが、
うまくいきません
以下のような結果になります。
うまく判定するにはどうすればよいのでしょう

#!/bin/csh -f
set CONSIZE=-0.01
echo "CONSIZE = $CONSIZE"
@ CONSIZE = $CONSIZE
if( $CONSIZE < 0.0 )then
echo " 0以下;;; $CONSIZE"
exit
endif

実行
CONSIZE = -0.01
@: 数値形式が正しくありません。

Aベストアンサー

整数しか扱えない為、そのままでは比較することができないようです。

bc を利用してみてはいかがでしょうか?

#!/bin/csh -f
set CONSIZE=-0.01
echo "CONSIZE = $CONSIZE"
set x = `echo "scale=3;if( $CONSIZE < 0 ) 1" | bc`

if( $x == 1 )then
echo " 0以下;;; $CONSIZE"
exit
endif


人気Q&Aランキング

おすすめ情報