Windows CMD は 2 つのディスク ドライブ間で重複ファイルを見つけます

Windows CMD は 2 つのディスク ドライブ間で重複ファイルを見つけます

ドライブが 2 つあります。ドライブ A (F:) とドライブ B (G:) です。ドライブ B のすべての内容をドライブ A にコピーしました。しかし、その後、ドライブ B に新しいファイルとフォルダーが追加されました。ドライブ B から重複したファイルとフォルダーを削除し、ドライブ A に存在しないものだけを残したいと思います。

重複が見つかるかどうかを確認するために以下のコマンドを試しましたが、変数にフルパスが含まれているため、期待どおりに機能しません%%a。もちろん、現在の出力は、機能する場合は同等のものecho %%aに置き換えられます。DEL

@echo off
for /F "tokens=*" %%a in ('dir G:\*.* /b /s') do if not exist "F:\%%a" echo %%a >> C:\Users\billy\Desktop\files.txt
pause

/sコマンドからスイッチを削除すると、完全なパスではなくファイル名のみが含まれるdirため機能します%%aが、サブフォルダーに対して再帰的に機能しないため、それほど便利ではありません。

答え1

@echo off
for /F "delims=" %%a in ('
  dir G:\*.* /b /s /A:-D
  ') do if not exist "F:%%~pnxa" echo del "%%~a" >> C:\Users\billy\Desktop\files.txt
pause

説明:

  • /A:-D後続のdelコマンドではディレクトリではなくファイルが削除されるため、リストからディレクトリ (フォルダー) を除外します (例del /?: ディレクトリが指定されている場合、ディレクトリ内のすべてのファイルは削除されますが、フォルダー自体は削除されません)。
  • フォルダを別々に扱う: スイッチに対して別のものを使用しますがfor /F、この場合はコマンドの代わりにdir/A:Drddelフォルダを削除する;rd /Sフォルダー ツリー全体 (フォルダー自体に加えてすべてのファイルとサブフォルダー) を削除する場合に使用します。
  • %%~pnxa%%a完全に拡大するパス + 名前 + 拡張子先頭に\G:ディスク指定なし)を含む。
  • del "%%~a"スペースを含むパスを適切に処理するために、完全なパスを二重引用符で囲みます。
  • "delims="代わりに、ファイル名の先頭のスペースを適切に処理することをお勧めします"tokens=*"(これはフラグなしでも実行できます/S)。
  • 追加のコマンドラインスイッチを検討してください (およびを参照del /?) rd /?

関連情報