[前の記事]« ERRORLEVELでの条件分岐が意図した結果にならない
[次の記事][テクニック紹介] BATファイル中で指定秒間WAITをかける方法 »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「DEL,ERASE,REN…ファイル削除/復活/移動/名前の変更」索引へ
▲カテゴリー「FOR /F」索引へ

[NT系]バックアップ元に存在しないファイルの削除方法


923) バックアップ元に存在しないファイルの削除方法 山本 2003/12/04(木) 12:56


現在、ATコマンドとxcopyを利用して、1日おきにAフォルダから
Bフォルダにバックアップを取っています。

バックアップ元のAフォルダ内のファイルが削除された場合、
バックアップ処理時にBフォルダ内の同名のファイルも削除される
ようにしたいのですが、どのような方法があるのでしょうか?

924) Re:バックアップ元に存在しないファイルの削除方法 ふぇむ 2003/12/04(木) 16:42


>現在、ATコマンドとxcopyを利用して、1日おきにAフォルダから
>Bフォルダにバックアップを取っています。
>バックアップ元のAフォルダ内のファイルが削除された場合、
>バックアップ処理時にBフォルダ内の同名のファイルも削除される
>ようにしたいのですが、どのような方法があるのでしょうか?

XCOPY なら相対的に同様の構造でしょうから。例えばですが。
Bフォルダを基準にして、Bフォルダ配下の全階層のファイルについて、Bフォルダの基点から辿ったパスと同じ位置にあるAフォルダ配下のファイル(Aフォルダの基点から同じように辿る)を調べて、なかったら消す、というバッチスクリプトを組む。

DOSバッチコマンドスクリプトの範囲で作れます。実は自己流で作ったものを必要に応じ使ってます。存在の有無だけではなく、サイズの比較、タイムスタン プの比較、FC を使ったバイナリコンペア、なんかも組み入れられます。が、ここに掲載するには少々長すぎます。コメントや空行など含めて600行弱かかってます。私が書 くと汎用に書くせいか長くなる傾向があるような気がするので、心臓部だけに着目すればもっとコンパクトになるかも。


925) Re2:バックアップ元に存在しないファイルの削除方法 ふぇむ 2003/12/04(木) 16:49


>DOSバッチコマンドスクリプトの範囲で作れます。実は自己流で作ったものを必要に応じ使ってます。

このようなものを掲載してもあまりありがたくないかもしれませんが、そのスクリプトから主要なコメントだけを抜き出しました。おおむねこんなような構造でつくればできると思います。

rem //
rem // 2つのディレクトリ間のファイルの比較
rem // 1つのディレクトリを基準に、もう1つを調査。
rem //
rem //

rem ## /////////////////////////////////////////
rem ## 処理開始
rem ## /////////////////////////////////////////
rem ---------------------------------------------- 環境セット
rem ## コマンドスクリプト所在基本環境情報の取得
rem ## 起動カレント環境情報の取得
rem ## ログファイル名設定
rem ---------------------------------------------- MAIN
rem ## 引数チェック~なければ終了
rem ## ロギング開始
rem ## ファイルの比較
rem ## /////////////////////////////////////////
rem ## 処理終了
rem ## /////////////////////////////////////////


rem ----------------------------------------------------------- NOT REACHED
rem ##
rem ## ファイル比較
rem ##
rem ## \ で終端
rem ## ソースファイルフルパス文字列を加工して
rem ## ターゲットファイルフルパス文字列生成
rem ## ソースファイルの属性チェック
rem ## ターゲットファイルの属性チェック
rem ## コンペアソースはファイルかディレクトリか
rem ## コンペアターゲットの存在確認
rem ## タイムスタンプの比較
rem ## サイズの比較
rem ## FC によるファイルのバイナリコンペア
rem ##
rem ## ファイルがなければ何もしない
rem ## FC によるファイルのバイナリコンペア
rem ## 結果の総括表示

rem :::::::::::::::::::::::::::::::::::::::::::::::::::::::
rem 関 数 群
rem :::::::::::::::::::::::::::::::::::::::::::::::::::::::
rem
rem ****************************************
rem 現在日時タイムスタンプ
rem ****************************************
rem **************************************************************
rem ファイル名関係展開処理
rem 第1引数: 対象ファイル名またはディレクトリ名文字列
rem 第1引数は "" で囲うこと
rem 第2引数: 展開処理後の返り値変数のベース名とする文字列
rem **************************************************************
rem **************************************************************
rem ファイル名関係展開結果の表示
rem 第1引数: 展開結果保存変数のベース名
rem **************************************************************
rem ##
rem ## 変数の間接展開
rem ##




926) Re3:バックアップ元に存在しないファイルの削除方法 ふぇむ 2003/12/04(木) 17:05


すみません、もうちょっと身のあることを書きます。

自作のスクリプトのコアの部分の抜粋。詳しく説明しだすときりがないのですが、とりあえず雰囲気だけでもなんとなくわかりますでしょうか?


基本環境のチェックなどを行なった後、

rem ##
rem ## ソースとターゲット(コマンドライン引数より)
rem ##
set SOURCE_ROOT=%~1
set TARGET_ROOT=%~2

if NOT "%SOURCE_ROOT:~-1%" == "\" set SOURCE_ROOT=%SOURCE_ROOT%\
if NOT "%TARGET_ROOT:~-1%" == "\" set TARGET_ROOT=%TARGET_ROOT%\

ってな感じで比較の基準側と対象側の基点フォルダ名を取得します。ここではコマンドラインから与える想定です。
で、dirコマンドを使ってまず基準側(以下ソースと言ってます)のファイルの全リストを作る。

rem ##
rem ## ソースのリスト作成
rem ##
dir /b /s "%SOURCE_ROOT%" > "%TEMPLIST%"


で、このリストに基づいて全件ループします。それが次。

rem ##
rem ## ファイルの比較
rem ##
for /F "usebackq tokens=*" %%z in ( "%TEMPLIST%" ) do (
call :FILE_COMP "%%z" "%SOURCE_ROOT_FULL%" "%TARGET_ROOT_FULL%"
)

:FILE_COMP がメインで、第1引数がソース側ファイルのフルパス、第2引数がソースの基点フォルダ、第3引数がターゲットの基点フォルダで、1件づつ処理します。

ループ先の :FILE_COMP では
rem ##
rem ## ソースファイルフルパス文字列を加工して
rem ## ターゲットファイルフルパス文字列生成
rem ##
set __COMPARE_TARGET_EDIT=%%__COMPARE_SOURCE:%__SOURCE_ROOT%=%__TARGET_ROOT%%%
call :POINTER_EXPAND_DO __COMPARE_TARGET "%__COMPARE_TARGET_EDIT%"

ってな感じで、ソース側ファイルのフルパスのソース基点フォルダ部分をターゲットに置換してやれば、双方のフルパスが得られるので、以下調べるなり煮るなり焼くなり消すなり、どうにでもできます。

:POINTER_EXPAND_DO ってのはこんなことやってるだけです。

set %~1=%~2
goto :eof

ここまで書けば作れます? 難しいかな...




937) Re:バックアップ元に存在しないファイルの削除方法 Hellcat 2003/12/06(土) 15:40


>バックアップ元のAフォルダ内のファイルが削除された場合、
>バックアップ処理時にBフォルダ内の同名のファイルも削除される
>ようにしたいのですが、どのような方法があるのでしょうか?

>バックアップ元のAフォルダ内のファイルが削除された場合、
>バックアップ処理時にBフォルダ内の同名のファイルも削除される
>ようにしたいのですが、どのような方法があるのでしょうか?

ディレクトリーの構成などがはっきりしないので、単純なケースを想定して考えてみました。
参考までに。

前提

バックアップ元のディレクトリーを\ORIGIN
バックアップ先のディレクトリーを\BACKUP
と仮定。
これらにサブディレクトリーはないものとし、\ORIGIN内のファイルのみをバックアップしていると仮定。

バックアップ元のファイル名称とバックアップファイル名称は同一の名称とする。

という前提で、\ORIGINディレクトリー上の或るファイルが削除されたら、当該ファイルと同一のファイル名称の\BACKUPディレクトリー上のファ イルを削除するという場合、Unix like toolsというフリーソフトを使い、以下のような方法を考えてみました。

削除前に以下のコマンドを一回実行する。
CD \ORIGIN
LS > \NAMES.TXT

削除後に以下のコマンドを実行する。
LS >> \NAMES.TXT
SORT \NAMES.TXT | UNIQ -r > \DELETED.TXT
FOREACH i `CAT \DELETED.TXT` ; DEL \BACKUP\$i /P

簡単な説明
(1)削除前
CD \ORIGIN
LS > \NAMES.TXT
まずカレントディレクトリーを\ORIGINへ移動((ファイル名称をディレクトリー名称が付加されていない形で取得するため)。
\ORIGINディレクトリー上のすべてのファイル名称をLSコマンドで取得し、\NAMES.TXTへ書き出す。
DIRコマンドで単にファイル名称のみを出力することができれば、それでも可。

(2)削除後
LS >> \NAMES.TXT
削除した後、\ORIGINディレクトリー上のすべてのファイル名称をLSコマンドで\NAMES.TXTへ追加モードで書き出す。つまり、削除されなかったファイル名称は\NAMES.TXTファイル上で重複することとなる。

SORT \NAMES.TXT | UNIQ -r > \DELETED.TXT
\NAMES.TXTファイルを上昇順にソートし、UNIQコマンドで重複していない行(つまり削除されたファイル名称)のみを抽出し、\DELETED.TXTファイルに書き出す。

FOREACH i `CAT \DELETED.TXT` ; DEL \BACKUP\$i
CATコマンドで\DELETED.TXTの内容(ファイル名称)をすべて出力し、変数"i"に代入。
DELコマンドで\BACKUP\$iに代入されたファイルを連続して削除する。

なお、win2000やXPではFOREACHコマンドの代わりにFORコマンドが使えると思われる。
また、`CAT \DELETED.TXT`の代わりに`TYPE \DELETED.TXT`としてテストしてみたが、エラーとなってしまった(WinXP)。

これらのツール(LS,UNIQ,FOREACH,CAT)は
win9x Meなどでは
UXTL412F.TAR
http://www.asahi-net.or.jp/~bi3t-aoym/nidetool.htm

win2000, XPでは
NTUXTL006.LZH
http://www.piedey.co.jp/softs/ntuxtl006.html

などを参考にしてください。



939) Re2:バックアップ元に存在しないファイルの削除方法 ふぇむ 2003/12/06(土) 21:47


>これらにサブディレクトリーはないものとし、\ORIGIN内のファイルのみをバックアップしていると仮定。

それはちょっときつい仮定では...

サブディレクトリがあったときにリカーシブコール的に処理するのが大変そう。あと、uniq のオプションは -r でいいんでしょうか。 -u だったりしません? なんとなく、-r って複数あるやつを出力するような。 -u がユニークなやつだけ出すという気がするのですが。私はそのコマンドの実装を知らないので違うかも。



941) Re3:バックアップ元に存在しないファイルの削除方法 Hellcat 2003/12/06(土) 23:21


>それはちょっときつい仮定では...
>サブディレクトリがあったときにリカーシブコール的に処理するのが大変そう
山本さんの御質問の趣旨が奈辺にあるかなのですが。
或るファイルを削除したときに、連動して他のディレクトリー上の同名のファイルを削除する方法をお考えなのかと推測して、仮定をたてました。

>あと、uniq のオプションは -r でいいんでしょうか。
> -u だったりしません? なんとなく、-r って複数あるやつを出力するような。
> -u がユニークなやつだけ出すという気がするのですが。
失礼しました。m(_ _)m
-uでした。訂正します。
マニュアルでは以下のようになっていました。

-c: 出力の行頭に、その行が連続して何回現れたか表示する。
-d: 2回以上連続して現れた行のみ出力する。
-u: 2回以上連続して現れなかった行のみ出力する。但し、-dと-uの両方が指定された場合、両方とも指定しなかったのと同じ扱いになる。
-数: 行同士の比較を、先頭から指定された数だけのフィールドを無視した上で行う。ここで「フィールド」とは、空白文字で区切られた、空白文字以外の文字列を指す。
+数: 行同士の比較を、先頭から指定された文字数を無視した上で行う。「-数」オプションと併用できる。


938) Re:バックアップ元に存在しないファイルの削除方法 福田 2003/12/06(土) 21:03


山本 さん こんにちは

>バックアップ元のAフォルダ内のファイルが削除された場合、
>バックアップ処理時にBフォルダ内の同名のファイルも削除される
>ようにしたいのですが、どのような方法があるのでしょうか?

発想を換えて、Aフォルダの内容を全てCフォルダにコピー
コピー後、Bフォルダを削除、CフォルダをBフォルダにリネーム

と言うのは・・・・


940) Re2:バックアップ元に存在しないファイルの削除方法 ふぇむ 2003/12/06(土) 21:52


>発想を換えて、Aフォルダの内容を全てCフォルダにコピー
>コピー後、Bフォルダを削除、CフォルダをBフォルダにリネーム

>と言うのは・・・・

容量が一時的に全体の2倍必要というのがネックになる場合もあるかもですね。
また上記のようにするなら、なんとなく1つのアーカイブにしたいですね。
NTbackup でも LHA みたいなのでもいいですけれど。


951) Re3:バックアップ元に存在しないファイルの削除方法 山本 2003/12/08(月) 16:10


ふぇむ様、Hellcat様、福田様
ご返答いただきありがとうございました。

私の説明不足で申し訳なかったのですが、サブディレクトリを含む
バックアップ処理であったことと、バックアップ時の負荷を抑える
ためにxcopyを用いていたことから、今回のバックアップ処理には
ふぇむ様の案を参考にさせていただきました。

まだ未熟なものですから、色々調べながらになってしまい、お礼が
遅くなってしまって申し訳ございませんでした。
  • ◆923.  バックアップ元に存在しないファイルの削除方法 (山本)   2003/12/04(木) 12:56
    •  924.  Re:バックアップ元に存在しないファイルの削除方法 (ふぇむ)   2003/12/04(木) 16:42
      •  925.  Re2:バックアップ元に存在しないファイルの削除方法 (ふぇむ)   2003/12/04(木) 16:49
        •  926.  Re3:バックアップ元に存在しないファイルの削除方法 (ふぇむ)   2003/12/04(木) 17:05
    •  937.  Re:バックアップ元に存在しないファイルの削除方法 (Hellcat)   2003/12/06(土) 15:40
      •  939.  Re2:バックアップ元に存在しないファイルの削除方法 (ふぇむ)   2003/12/06(土) 21:47
        •  941.  Re3:バックアップ元に存在しないファイルの削除方法 (Hellcat)   2003/12/06(土) 23:21
    •  938.  Re:バックアップ元に存在しないファイルの削除方法 (福田)   2003/12/06(土) 21:03
      •  940.  Re2:バックアップ元に存在しないファイルの削除方法 (ふぇむ)   2003/12/06(土) 21:52
        •  951.  Re3:バックアップ元に存在しないファイルの削除方法 (山本)   2003/12/08(月) 16:10
 
 


カテゴリー「DEL,ERASE,REN…ファイル削除/復活/移動/名前の変更」索引へ
カテゴリー「FOR /F」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2003年12月04日 18:44に投稿されたエントリーのページです。

ひとつ前の投稿は「ERRORLEVELでの条件分岐が意図した結果にならない」です。

次の投稿は「[テクニック紹介] BATファイル中で指定秒間WAITをかける方法」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート