web-dev-qa-db-ja.com

2つのフォルダーを再帰的に比較し、異なるファイルとフォルダーのリストを生成するにはどうすればよいですか?

tl; drと例

2つのフォルダーを再帰的に比較し、(サイズまたはタイムスタンプ、àlarsyncによって)異なるすべてのファイル(およびフォルダー)の相対パスを出力する方法を探しています。

たとえば、私が持っていると言う

C:\source\foo\a.txt
C:\source\foo\bar\b.txt
C:\source\foo\bar\c.txt

そして

C:\target\foo\a.txt
C:\target\foo\bar\b.txt
C:\target\foo\bar\d.txt
C:\target\foo\baz\

また、b.txtC:\sourceの下で変更されたため、新しいと仮定します。

次に、魔法のスクリプトまたはコマンド、たとえばmagic C:\source C:\targetを指定すると、出力は

foo\bar\b.txt

または、ソースフォルダーまたはターゲットフォルダーのいずれかのフルパスも使用できます。

C:\source\foo\bar\b.txt

例が示すように、削除または作成されたファイルやフォルダーは気にしません!これにより、このタスクは他の方法よりもはるかに簡単になります。

私がすでに知っていること...

私自身はUNIX開発者であり、これが私たちが扱っているUNIXシステムであるかどうかは尋ねませんが、残念ながら。また、これはカスタムの夜間バックアップソリューション用であり、信頼性とデータの整合性が優先されるため、 数週間前 バッチスクリプトでforループを理解することすらできませんでした。私はこれを正しく行うための経験がないか、またはこれを行うための最良の方法を決定することさえできないと確信しています。

http://www.howtoforge.com/backing-up-with-rsync-and-managing-previous-versions-history を読んで、rsyncが私が求めているようなことを実行できることを学びました。次のようなオプションを使用する

--dry-run               # don't actually rsync (touch) any files
--itemize-changes       # list changes rsync _would_ have made
--out-format="%i|%n|"   # define an output format for the list of changes

ただし、Rysyncを使用するためにCygwin(cwRsync)に依存することは嫌いです。すでにCygwinインストールで迅速で汚れた実験を実行する傾向があり、環境を破壊し、数週間ごとにCygwinを再インストールする必要があるためです。そのようなことは、夜間のバックアップの「信頼できる」部分に対抗します。

Windowsでrsyncのような「正規の」ツールは見つかりませんでした。少なくとも、上記のようなオプションをサポートするツールはありません。また、特にこの目的のためのシンプルでコンパクトなツールでない限り、一般的にソフトウェアを探していません—私は透過的でプログラム的な解決策を好みます。ファイルのバックアップと同じくらい重要なものについて、私が見ることも理解することもできないソフトウェアやコードに依存することは恐ろしいことです!

要約

バッチスクリプト構文に頭を悩ませることはできません。次に、PowerShellを試します。しかし、このタスクが与えられた場合、あなたは何をしますか?—私が見逃している明らかなルートはありますか?

6
Andrew Cheong

@ Glytzhkofは彼の答えでRobocopyを推奨しました、そしてそれは私のニーズに完全に適合しました。

tl; dr

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs

                                C:\source\foo\bar\b.txt

オプションの詳細と説明

Robocopy (Wikipedia)はWindowsシステム管理に広く採用されているようです。は 十分に文書化されています (TechNet); Stack OverflowServer Fault 、そしてもちろん、ここでは Super User ;多目的ツール(肥大化やバグになりがち)ではなく、特定の機能を提供します。さらに、1997年からこの特定の機能を提供しています。私にとって、これらすべての要素は、クローズドソースであるにもかかわらず「透明性」に貢献し、心を落ち着かせます。

Robocopyは、現在 Windows Server 2003リソースキットツール として知られている一連のツールの一部として提供されます。ダウンロードしてインストールした後、質問のシナリオを再作成して、試してみました。

C:\>robocopy.exe source target /l /e /zb

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------

  Started : Thu May 01 09:08:20 2014

   Source : C:\source\
     Dest : C:\target\

    Files : *.*

  Options : *.* /L /S /E /COPY:DAT /ZB /R:1000000 /W:30

------------------------------------------------------------------------------

                           0    C:\source\
                           1    C:\source\foo\
        *EXTRA Dir        -1    C:\target\foo\baz\
                           2    C:\source\foo\bar\
          *EXTRA File                  1        d.txt
            Newer                      5        b.txt
            New File                   1        c.txt

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         3         0         3         0         0         1
   Files :         3         2         1         0         0         1
   Bytes :         7         6         1         0         0         1
   Times :   0:00:00   0:00:00                       0:00:00   0:00:00

   Ended : Thu May 01 09:08:20 2014

いいね!オプションについて説明しましょう。

  • /lはアクションをリストしますなし実際にそれらを実行します。
  • /eにはサブディレクトリが含まれますが、/sとは異なり、空のディレクトリも含まれます。
  • /zbは「再起動」モードでコピーし、アクセスが拒否されると「バックアップ」モードになります。最も安全なアプローチのようです。続きを読む ここ

実際にアクションを実行していないので、コピー関連のオプションは必要ありませんでした。

とにかく、次に、私が望む出力を得るためにスイッチを追加するだけでした:

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs

                                C:\source\foo\bar\b.txt

もう一度、オプションを見ていきましょう。

まず、私はmodifiedファイルとフォルダだけを気にしたので、次のようになります。

  • /xxは、「余分な」ファイルとディレクトリ(ターゲットにのみ存在するもの)を除外します。
  • /xlは、「孤独な」ファイルとディレクトリ(ソースにのみ存在するもの)を除外します。

次に、相対パス(または名前だけでなく、少なくともフルパス)が必要でした。

  • /fpはフルパスを有効にします(当然のことながら、相対パスのオプションはありませんでした)。

第三に、私は可能な限り多くの伐採毛羽を取り除きたいと思いました、そして私はそれのallが取り外せることを見つけて嬉しく驚きました:

  • /nsは、ファイルサイズを抑制します。
  • /ncはクラスを抑制します、Newer
  • /ndlはディレクトリ名を抑制します。
  • /npは、コピーの進行状況の出力を抑制します。
  • /njhは、ジョブヘッダーを抑制します。
  • /njsはジョブの概要を抑制します。

そして、あなたはそれを持っています!


私の目的(変更されたファイルのバージョン管理されたバックアップの作成)のために、変更された各ファイルのタイムスタンプも実際に取得したいことに気付きました。 /tsを追加するだけです。

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs /ts

                         2014/05/01 15:20:42    C:\source\foo\bar\b.txt
5
Andrew Cheong

新しいバッチファイルを毎晩バックアップドライブにコピーするサードパーティのツールがあったカスタムバッチ駆動のバックアップシステムを作成しました。私の人生では、この時点でそのツールの名前が何であったか思い出せません。私はそれを見つけることができるかもしれませんが、今はできません。

そこにある最も安価な商用比較ツールはBeyond Comparefrom http://www.scootersoftware.com/ -それです素晴らしいツールを手に入れています。その有用性はすぐに発揮され、ファイルを扱うすべての専門家が毎日役立つツールです。 試してみてくださいスクリーンショットを参照コマンドラインバージョンが含まれています

それ以外は Robocopy.exe は、ある程度の忍耐とテストを行うことで、目的を達成できるはずです。

もう1つのヒント:バックアップの災害を回避するために、私はバックアップスクリプトを低特権アカウントで実行して、誰かがスクリプトをごちゃごちゃにしたり、スクリプトを使ってログオンしようとした場合に権限をまったく削除したりしないようにしました。アカウントを非インタラクティブに設定したか、インタラクティブにログオンできないなどと思います。 Windowsでのバッチ実行には、これを強くお勧めします。あなたはUnixの世界から来ているので、私がそれについて言及したいと思っただけです。

2
Stein Åsmul