3

すべてのサブディレクトリからすべてのファイルを抽出し、後で空のサブディレクトリを削除するスクリプトがあります。抽出する部分は次のようになります。

for /r %%a in (*.*) do move "%%a" "%~dp0"

「_Unsorted」という名前のサブディレクトリを除いて、これを行う方法はありますか?/excludexcopyにはオプションがあることを知っているので、

for /r %%a in (*.*) do xcopy "%%a" "%~dp0" /exclude "\_Unsorted\"

ほぼ機能しますが、コピー後に元のファイルを削除して、基本的に同じ結果になるようにする方法がわかりません。move

4

3 に答える 3

3

robocopyを使用できますか?

robocopy from\path to\path *.* /mov /e /xd _Unsorted

/mov:コピーではなく移動(コピー後にソースを削除)

/e:再帰的(空のサブディレクトリを含む)

/xd _Unsorted:_Unsortedという名前のディレクトリを除外します

于 2013-03-01T19:27:58.730 に答える
1

いくつかのバッチのみのオプション:

  1. ループ本体にフィルターを追加します。

    for /r %%a in (*.*) do (
      (echo %%~dpa | find /i "\_Unsorted\" 1>nul) || move "%%a" "%~dp0"
    )
    

    または:

    for /r %%a in (*.*) do (
      (echo %%~dpa | find /i /v "\_Unsorted\" 1>nul) && move "%%a" "%~dp0"
    )
    

    どちらのバージョンでも、このfindコマンドを使用して、ファイルのパスをサブストリングと照合します\_Unsorted\。最初のバージョンでは、一致する場合などにfind戻ります。コマンドは、演算子の効果である、の場合にのみ呼び出されます。successfailmovefail||

    2番目のバージョンでは、/vスイッチはの結果を逆にし、一致しないことを意味findします。したがって、演算子はの場合に呼び出すために使用されます。success&&movesuccess

  2. フィルタをファイルリストに適用して、ループが_Unsortedエントリを繰り返さないようにします。

    for /f "delims=" %%a in (
      'dir /s /b ^| find /i /v "\_Unsorted\"'
    ) do move "%%a" "%~dp0"
    

    これは、for /rループをfor /f1つに置き換えるため、前のオプションよりも元のスクリプトに対するより重要な変更です。

    基本的に、for /fループは、テキスト、テキストファイル、またはコマンドの出力の読み取り/解析に使用されます。この場合、dirコマンドは現在のディレクトリのツリーにあるファイルの完全なリストを提供し、コマンドはそれらのパスにfind含まれているファイルを除外します。ループは、リストがによってフィルターされた後にリストを読み取ります\_Unsorted\。つまり、 (サブ)フォルダーに格納されているファイルにヒットすることはありません。for /ffind_Unsorted

于 2013-03-01T22:36:58.163 に答える
0

上記の回答3は、ROBOCOPYを使用して、(おそらく空の)サブディレクトリのツリーを作成します。

以下では、xxcopyを取得する必要があります

xxcopy c:\filematch d:\dest\ /SGF /RC

c:からフォルダd:\destにコピーします

/ SGFはサブディレクトリを繰り返しますが、宛先で結果をフラット化します。ファイル名が衝突した場合、最初の重複ファイル名に.0001が追加されます。したがって、/ SGFは、どのサブディレクトリを占有しているかに関係なく、一致するすべてのファイルをソースドライブから指定された宛先フォルダにコピーします。

/ RCは、コピーが成功した後、ソースからファイルを削除します。別名、ファイルを移動します。

OPが望んでいたものかどうかはわかりませんが、この議論は私を助けてくれました!

于 2014-04-08T16:46:08.407 に答える