出産前後の痔にはご注意!

バッチ処理でデータをftp受信しています。
---------------------------
ユーザ名
パスワード
prompt
mget abc*.log
mdelete abc*.log
bye
---------------------------
このようなコマンドを行っています。
ftpサーバにはさまざまなファイルが随時生成されます。

この処理では定期的に
abcで始まる全てのログファイルをgetし、
abcで始まる全てのログファイルをdeleteしています。

ところが、abcで始まるファイルの生成がランダムのため、
偶然mgetが終わった後でファイルが生成され、
mdeleteを行うと、getしていないファイルまで削除される恐れがあるのです。

そのため、一件ずつ移動を行いたいのですが、
調べてもmoveのようなコマンドがftpで見当たらないのですが
なにか、moveに置き換わるような処理はないでしょうか?

*windows同士の通信です。

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

A 回答 (3件)

ftpはあくまでファイル転送プロトコルなのでmoveなどは無いです。


こんな感じでバッチファイルで。テストはしていません。

set HOST=ホスト名
set USER=ユーザ名
set PASS=パスワード
echo %USER%>tmp1
echo %PASS%>>tmp1
echo ls abc*.log tmp2>>tmp1
echo quit>>tmp1
ftp -s:tmp1 %HOST%
echo %USER%>tmp1
echo %PASS%>>tmp1
for /f %%F in (tmp2) do (echo get %%F&echo delete %%F)>>tmp1
echo quit>>tmp1
ftp -s:tmp1 %HOST%

別の方法として、Windowsホストのftpサーバーって使ったこと無いのでわかりませんが、もしかすると

ren abc*.log abc*.tmp
もしくは
quote site ren abc*.log abc*.tmp

が効けば、後は
prompt
mget abc*.tmp
mdelete abc*.tmp
受信後に、ren abc*.tmp abc*.log で名前を戻す。
    • good
    • 0
この回答へのお礼

あえて名称を変える処理も思いつきませんでした。
そういう方法もあるのですね!
目からうろこです。早速試してみます
最近は便利な機能が最初からセットされているものが増えているため、
こういった、「こうしてはどうか?」といった
考え方がなかなか出来なくなっている気がします。

丁寧なご回答ありがとうございました(^^)。

お礼日時:2006/10/10 20:48

はじめまして。



以下の様な流れではだめでしょうか。

1.ftp接続し、対象ファイルの一覧を取得する。
※一時ファイルに保存する。

2.ファイル一覧のファイルをget,deleteする。
※一時ファイルの一覧について処理を行う。

3.1.2.を繰り返す。

これであれば、サーバへの接続方法はftpだけで対応ができます。
    • good
    • 1
この回答へのお礼

確かに!一覧を先に取得しておけば
それだけを取得・削除が出来そうですね。

ご回答ありがとうございました(^^)

お礼日時:2006/10/10 20:42

telnetして moveをつかう  じゃだめなのかな?

    • good
    • 0
この回答へのお礼

ftpサーバは別会社のもので、
ユーザ名とパスワードを振り分けられているのです。

ftpログインなどの管理・チェックも行っているため、
telnet利用はだめかと思います。
他に方法がなければ提案してみますね。

ご回答ありがとうございました(^^)

お礼日時:2006/10/07 16:23

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

Qftpのmgetコマンドの自分の格納場所の指定方法は?

先日、ftpコマンドについてこのサイトで色々教えていただき感謝しております。

複数のファイルを受信するのにmgetコマンドを教えていただいたのですが、
相手より受信した場所の格納場所の指定が上手くいきません。

先方にFTPとしてログインでき、"PROMPT"→"MGET *"と行うのですが、受信したファイルの格納場所がCドライブの直下になってしまいます。
自分のインターネットサービスマネージャーの
ルートは別のフォルダに設定してあるのですが、これは受信したデータの初期値にはならないのでしょうか?
また、調べたところ省略すると、ワーキングディレクトリに作成されるみたいにかかれていましたが、ワーキングディレクトリはどこかで指定できるのでしょうか?

たとえばC:\AAAに受信したファイルを格納したい場合はどうやって書けばよいでしょうか?

MGET * C:\AAA見たいに色々試して見ましたが、駄目でした。

Aベストアンサー

方法は2つあります。

(1)データを格納するディレクトリに移動してからftpを起動させる。

cd 格納先ディレクトリ
ftp ホスト名
mget *

(2)ftpした後格納するディレクトリを指定する方法

ftp ホスト名
lcd 格納先ディレクトリ(自分のマシン)
mget *


lcd とは、"Local Change Directory" と思っておくと忘れなくていいですよ♪

QFTPの送信結果を検知したい

WindowsでFTPをバッチファイルから呼び出すことを考えています。FTPで送信エラーが発生した場合に、FTPのエラーとして検知したいのですが、その方法をご存じのかたおりましたら教えて下さい。(Windows-NTで標準で提供されるFTPを使用しています)直接私が確認したわけではありませんが、FTP送信でエラーが発生してもFTPの終了コードが0になってしまうらしく、FTPのエラーを検知できないそうです。WindowsであればWindows-NT以外の環境でもかまいませんので、ご存じのかたおりましたら教えて下さい。

Aベストアンサー

標準のツールでやるなら、ftpコマンドの出力をファイルにリダイレクトして、find か findstr コマンドで適当な文字列の有無で判断するしかないですね。

>FTPで転送後に転送先のホスト内のある処理が自動的に動き
とのことですが、転送先ホストで単純にデータファイルの有無で先に進むと、転送途中のファイルを読んだり、転送エラーで途中で終わったファイルを読んだりする可能性があるので、普通は、転送元でデータファイルの正常転送を確認後に目印ファイル(中身は空でよい)を送り、転送先では目印ファイルがあることでデータファイルが正しく受信できたことを判断して目印ファイルを消して先に進む(データファイルを処理する)のが良く使われる手法です。

QシェルスクリプトでFTPの実行結果を取得するには

OS redhat linux
シェル bornシェル

でftpを実行するスクリプトを作っていますが、
ftpの実行結果は取得できるのでしょうか?

ftp -n < ftpCom.txt

宜しくお願いします。

Aベストアンサー

No.1です。補足拝見しました。

直接ftpコマンドの戻り値では実行結果が判断できないので、私が以前に携わっていたプロジェクトでは、FTPサーバが出すエラーコードをgrepでハンドリングしていました。

FTPはコマンドの結果を「行頭に3桁の数字」で出力する仕様になっており、putもgetも送受信が成功した場合は226が出力されるので、

ftp -nv < ftpCom.txt > ftpLog.txt 2>&1

を例えにとると、このコマンドを実行した後に、
grep ^226 ftpLog.txt > /dev/null
if $? ne 0
then
echo "FTPでエラーが発生しました" >> logfile
exit 1
fi

みたいなことをしていました。grep の引数 ^226 は行頭が226から始まる行を検索、という意味で、grepでマッチする行があった場合は0が戻り値となり、マッチしなければ0以外が戻り値となるので、それを利用していました。

実際の運用では、処理が異常終了したときにlogfileを見て、FTPのエラーだったらさらにftpLog.txtを見る、みたいな感じでした。

なお、FTPサーバが返すコードについては下記RFCの4.2辺りを参照してください。もっとも、サーバによってこれら全てが実装されてるとは限りませんが。

http://hp.vector.co.jp/authors/VA002682/rfc959j.htm

No.1です。補足拝見しました。

直接ftpコマンドの戻り値では実行結果が判断できないので、私が以前に携わっていたプロジェクトでは、FTPサーバが出すエラーコードをgrepでハンドリングしていました。

FTPはコマンドの結果を「行頭に3桁の数字」で出力する仕様になっており、putもgetも送受信が成功した場合は226が出力されるので、

ftp -nv < ftpCom.txt > ftpLog.txt 2>&1

を例えにとると、このコマンドを実行した後に、
grep ^226 ftpLog.txt > /dev/null
if $? ne 0
then
echo "FTPでエラー...続きを読む

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qrenameコマンドについて

FTP先のファイル名を以下のように変更したいです。

rename *.txt *.csv

これを実行すると
550 *.txt: The filename, directory name, or volume label syntax is incorrect.

となってしまいます。
ワイルドカードは使用できると思っていたのですが、
何がいけないのでしょうか?
ちなみに
rename 111.txt 111.csv
と指定した場合は問題なくできます。
複数のファイルを変換したいので困っています。
環境はWindows2000です。宜しくお願いします。

Aベストアンサー

いちど、ダウンロードして、
ソフトなどで、ranemeして、アップロードするのはどうでしょうか?
http://download.goo.ne.jp/software/category/win/util/file/name/ext/

http://www.atmarkit.co.jp/fnetwork/rensai/netpro10/ftp-responsecode.html
FTPのレスポンスコード550について書かれています。

*.txtは不正確なファイル名とゆうことになり、実行できないのだと思います。

Qftpコマンドで複数のファイルを移動させたい

Solaris からftpコマンドを使用してwindosサーバに接続し、複数のファイルを./bak/フォルダにまとめて移動させたいのです。
renameを使えば、1つのファイルでなら可能ですが、複数は無理のようです。
rename test01.txt ./bak/test01.txt→OK
rename *.txt ./bak/*.txt    →NG

なんとかftpで複数ファイルの移動は出来ないのでしょうか?
1つずつ移動させるしかないのでしょうか?対象ファイルがたくさんあるので、それは避けたいのですが…。
ご教示願えればと思います。

Aベストアンサー

対象ファイルをzipで固めて、固めたzipファイルを送って解凍するとか。
普通のftpならmputとかmgetがあるけど。

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Qscpコマンドでリモートサーバのファイルを削除したい

winscpでリモートサーバのファイル削除が出来るので、てっきりscpコマンドでオプションがあるのかと思ったのですが、見当たりません。scpコマンドでリモートファイルの削除は可能でしょうか?誰か教えて!

Aベストアンサー

1番の方と同じ意見ですが、
ssh ホスト名 コマンド
でリモートサーバ上でコマンドが実行できますので

ssh SSH_SERVER "rm testfile"

のように実行するの一般的かと。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング