web-dev-qa-db-ja.com

すべてのファイルを複数のサブフォルダーから親フォルダーに移動します

通常、親フォルダーを開いて*を検索して、サブフォルダー内のすべてのファイルを選択しますが、この場合、1,000,000を超えるファイルを並べ替える必要があるため、エクスプローラーを試行するとクラッシュすることがよくありますGUIを介して多くのファイルをコピーします。コマンドプロンプトまたはバッチファイルを使用すると、これがどれほど効果的かはわかりませんが、試してみる価値はあると思います。

私がする必要があるのは、

|parent
|    |123
|    |    123abc.png
|    |456
|    |    456def.png
|    |789
|    |    789ghi.png

なる

|parent
|    123abc.png
|    456def.png
|    789ghi.png

はい、実際のファイル構造では、フォルダ名に付けられたファイル名の最初の3文字が含まれています(並べ替えに役立つ場合)。

10
Sean

コマンドプロンプトで FOR/R を使用します。

[FOR/R]は、[drive:] pathで始まるフォルダーツリーをたどり、一致する各ファイルに対してDOステートメントを実行します。

まず、ファイルの移動元の親フォルダーのステージングフォルダーoutsideを作成します。これにより、循環参照の可能性が回避されます。

あなたの場合、コマンドは次のようになります:

FOR /R "C:\Source Folder" %i IN (*.png) DO MOVE "%i" "C:\Staging Folder"

これをバッチファイルに入れたい場合は、%iから%%i

二重引用符が重要であることに注意してください。それらのいずれかを見逃さないでください。スペースを含むファイル名が正しく処理されるようにします。

移動が完了したら、必要に応じてステージングフォルダーの名前を変更/移動できます。

ヒント:ハードドライブの空き容量があり、時間がある場合は、何か問題が発生した場合に備えて、ファイルを移動するのではなく、安全に再生し、ファイルをcopyすることをお勧めします。上記のコマンドでMOVECOPYに変更するだけです。

17
misha256

これはいくつかのサンプルコードです:

:loop
    for /d %%D in (%1\*) do (move "%%D\*" %1\ && rmdir "%%D")
    SHIFT
    set PARAMS=%1
if not %PARAMS%!==! goto loop

このバージョンでは、サブフォルダーを削除するフォルダーをバッチにドラッグすると、すべてのファイルがサブフォルダーから親フォルダーに移動します。私は、ランダムにサブフォルダーを持っている、または持っていないダウンロードされたアーカイブファイルに使用します。心に留めておいてください、それは私のケースに固有のように、単一のサブフォルダーを念頭に置いて作られました。

'Shift'は、スクリプトで一度に多数のサブフォルダーをドラッグしたときに、次の引数に移動することです。

3
e.g

また、ファイルがあるフォルダーを参照する環境変数%%〜dpiを使用します。その後、ファイルの親フォルダーを取得する末尾のバックスラッシュを取り除くことができます。以下はそれだけです。

SetLocal EnableDelayedExpansion   
FOR /R "C:\Source Folder" %%i IN (*.png) DO (       
       Set "CurrFile=%%~i"     
       Set "TMPdp=%%~dpi"   
       Set "ParFldr=!TMPdp:~0,-1!"    
       @Echo MOVE "%%~i" "!ParFldr!" ) & REM Delete echo to move. Run to test.

!動的拡張を有効にし、%%〜iおよびParFldrに使用できます。したがって、%%〜iは!CurrFldr!一部のファイルには文字列が含まれるため、テスト中に実際に必要になります。好きではないということは、スクリプトが失敗して終了することを意味します。わかりやすくするために、%% Aをすべて%% iに変更しました。 Aが使用されていても小文字が使用されていても、まったく違いはありません。問題は一貫して同じ文字を使用しているため、%% Aをすべて%% iに変更しました。

2
Noshad Chaudhry

forfiles /s /m *.FILETYPE /c "cmd /c move @file .."は、指定されたFILETYPEのファイルを親フォルダに移動する必要があります

0
Serkan