電子書籍の厳選無料作品が豊富!

WindowsのDOSプロンプトを使ってファイルの削除を行いたいです。
とは言っても、わがままな(?)機能を探しているのですが....

ファイル名
  file1.log.001 ・・・ファイル容量  0KB
  file1.log.002 ・・・ファイル容量   0KB
  file1.log.003 ・・・ファイル容量 100KB
  file1.log.004 ・・・ファイル容量 100KB
の内、ファイル容量0KBのみを探し出して消したいのです。
 もちろんコマンドを直接打ち込むのであれば、
   c:> del file1.log.001エンター
   c:> del file1.log.002エンター
でいいことはわかっているのですが、バッチを組んで0KBのファイルのみを消したい。

 また、残った003と004の名前も変えたいのです。
   file1.log.003 → log001.log
   file1.log.004 → log002.log
と番号を詰めて....

 あるUnixベースのマシンで、日々ログを積み上げていくのですが、古いログファイルは削除
されていきます。
 ftpで一旦、WindowsXPマシンでgetしてきて、上の作業をやらせたいのですが、実際は20
以上のログファイルがあります。
 一回一回手打ちするのではなく、バッチで一気にやる方法を探しています。

 Unixマシンからのgetは、バッチ内に
   ftp -s:fileget.txt
を1行目に作成。
 fileget.tstの中身は下記
--------------------------
  open マシン名
  ユーザー名
  パスワード
  get file1.log.001
  get file1.log.002
  get file1.log.003
  get file1.log.004
  get file1.log.005
  get file1.log.006
  get file1.log.007
  get file1.log.008
  get file1.log.009
:
by
-----------------------------
結果、Unixマシンには無いfile1.log.001というファイルが容量0KBでWindows内にできて
しまっています。

 つたない文章でわかりづらいかもしれませんが、ご助言願います。

A 回答 (4件)

No3です。


VMSはUnixと関係の無いOSです。メーカーのDECがもうずいぶん前にCOMPAQに吸収され、そのCOMPAQもHPと合併したので、マイナーになり情報もあまりないでしょうね。

; のあとの数字は世代番号じゃなかったでしたっけ。拡張子とは異なるので、扱いはFTPサーバーの処理次第だと思います。
    • good
    • 0

fileget.tstの中身を、


--------------------------
  open マシン名
  ユーザー名
  パスワード
  prompt
  mget file1.log.*
  quit
-----------------------------
にすれば、file1.log.* に該当する存在するファイルだけがgetできます。
mget file*.log.* とかでも大丈夫。

バッチファイルで、ファイルサイズゼロのファイルだけを削除するのは、

for %%F in ( file1.log.* ) do if %%~zF == 0 del %%F

です。コマンドを直接打つときは%は1つだけ。
番号を振り直すバッチ処理は面倒だけど出来ます。mget がうまくいかなければ再度聞いてください。

この回答への補足

回答ありがとうございます。

なぜか、mgetコマンドが使えなかったんです...Unixマシンのせいなのか...


for %%F in ( file1.log.* ) do if %%~zF == 0 del %%F

については、明日以降、試してみます。

ありがとうございました。

補足日時:2012/01/18 21:52
    • good
    • 0
この回答へのお礼

バッチの中で for ~ ができるとは....20年以上前のPC-DOSのコマンド本にも載ってましたが、
これまで使ったことありませんでした。
WindowsのDOSプロンプトから for /? でもヘルプが現れて目からウロコです。
もちろん、教えていただいた記述でoKBのファイルを削除できました。

で、mgetですが、実際、会社でいろいろ確認してみました。

Unixベースマシンとしていたのは Open VMS VAX というOSでした。
ログのファイル名は FILE_NAME.LOG;04 って感じのファイルです。(末尾の2桁数字が複数ある)
Windowsからgetしようと試した結果が次です。
1.get FILE_NAME.LOG;04
    とするとWindowsでは FILE_NAME.LOG ができて次の末尾05,06,07..のファイルは上書き
2.get FILE_NAME.LOG.04
    とするとWindowsでは FILE_NAME.LOG.04 ができてる。次の末尾05のファイルもget OK。
3.mget FILE_NAME.LOG;*
    とするとWindowsでは 1.と同じ結果
4.mget FILE_NAME.LOG.*
    とするとWindowsでは 1.と同じ結果

なので、2.の記述でファイル1つづつを記述しないとならない状態です。
    

お礼日時:2012/01/21 18:22

forでループを組んで、if(exist・・・)を使って判断を入れれば、1行づつ書かなくても全てのファイルを舐めることはできますが、残念ながらファイル容量を所得するコマンドはありませんので、MS-DOSコマンドだけではできないですね。



ファイル名の変更は、renコマンドで良いですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

No.1で回答くださった方法、No.3で回答くださった方法を試してみます。

お礼日時:2012/01/18 21:53

バッチ記述用の完全構造化言語のBSLスーパーバッチというソフトがあります。


WindowsPCで使用しますが、DOSプロンプト上で動作します。
#FSizeという「ファイルの大きさ」関数が使えますので、0バイトのファイルを消すことができます。
#IsFileという「ファイルの存在の判定」関数もあります。
もちろん、変数も使用できますので、希望通りのことができそうです。
一度使用したことがあるので、分からなければ聞いてください。
ヘルプは充実していますので、何かしらプログラムを作成したことがある人ならすぐ理解できると思います。
詳しくは、ダウンロードしてヘルプを参照願います。

参考URL:http://www.vector.co.jp/soft/dl/win95/util/se070 …

この回答への補足

BSLスーパーバッチを試してみました。
ヘルプ参照してみましたが、残念ながら、プログラム書いたことのない私にはチンプンカンプンでした...。
「変数」と「環境変数」の違い、if else文とfor文の使い分けさえわかりません。

プログラムは20年くらい前、PC-DOSのREXXで1つだけバイオリズム計算を自作したことがあるくらいです。
Excelのマクロも自動記憶を使うくらいで....

また、よかったら、ご助言ください。

補足日時:2012/01/21 18:30
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
明日以降(明日とは言い切れない^^;)、試してみます。

結果は、またお知らせいたします。

お礼日時:2012/01/18 21:49

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