ディレクトリ構造をフラット化


15

フォルダ内に多数のフォルダがあります。このような

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

すべてのフォルダーを折りたたんで、folder1、folder 2、folder 3、... folder nの下のすべてのファイルがルートフォルダーの下に存在するようにします。

Windowsでこれを行う最も簡単な方法は何ですか?


5
それは、ファイル名の重複をどのように処理したいかによって異なります。
マークアレン

回答:


19

特別なツールやスクリプトを使用する理由はありません。エクスプローラーで検索機能を使用するだけです。

  1. エクスプローラーでフラット化するフォルダーを開きます。
  2. 新しいフォルダーを作成し、すべてのファイル(ただし、フォルダーではない)を選択し、それらをそのフォルダーにドラッグします(これにより、これらのファイルの2つのコピーを取得しなくなります)。
  3. 検索ボックス(アドレスバーの右側)に入力し*、Enterキーを押します。
  4. リストが表示されたら、右クリックしてすべてを選択し、右クリックして[切り取り]をクリックします。
  5. 戻るボタンを押して元のフォルダーに戻り、右クリックして貼り付けます。
  6. 名前が重複している場合は、これに対処する方法を尋ねられます。ユースケースに最適なオプションを選択してください。(両方のファイルをコピーすることになると思います。)再度プロンプトが表示されないようにするには、下部にあるチェックボックスを使用して、すべてのファイルにこれを適用してください。
  7. すべてのフォルダーを選択し、選択したファイルの数に関するポップアップを見て空であることを確認してから、それらを削除します。

スクリプトを作成して、それを開始して忘れることができるようにしたい場合は、それも実行できます。置換するコマンドmv *\* .は非常に簡単です(for /r %f in (*.*) do @move "%~f" .)が、@ Nicole Hamiltonの答えのようにそれらを残さずに、重複を処理したいと確信しています。重複のファイル名に数字を追加するのがおそらく最も簡単な方法です。

次のバッチファイルをコピーしてメモ帳に貼り付け、 "flatten.cmd"(引用符を含む)として保存します。

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

スクリプトを使用するには、単純化するフォルダーをその上にドラッグします。


1
同様だが理解しやすい:superuser.com/a/523854/433830
aparente001

注:このスクリプトは、本質的にフォークボムです。数千のサブディレクトリと数万のサブファイルがあるフォルダで使用していますが、メモリフットプリントは徐々に増加しています。OOMの問題に遭遇することはないと思いますが、心に留めておくべきことです。
Nzall

@Nzall私はそれができると信じているのに問題はないが、私は自分のコードではなくマイクロソフトを非難するだろう。バッチファイルでサブルーチンを複数回呼び出すだけです。そして、一度に複数実行することはありません。各サブルーチンは完了するまで実行され、一度に1つのプロセスのみを実行します。どのくらいのメモリが使用されていると言っていますか?
trlkly

@trlkly一時的に2 GBになりましたが、かなり多くのフォルダーとサブフォルダー、約75,000のファイルと数千のフォルダーがありました。数分後、8〜900 MBに戻りました。ただし、重複するファイルが多数ありました。7,500ファイルのJavascriptライブラリの12個のコピーを統合して、特定のソフトウェアが何万ものファイルを含むフォルダーをどのように処理するかをテストできるようにしました。
Nzall

@Nzallそれは私にとって信じられないほど奇妙です。スクリプトはそれを行うべきではありません。これは、1つの変数を再利用してファイルをインクリメントする1つのサブルーチンです。SOなどでこのような大量のメモリ使用が発生する原因を尋ねる必要がある場合があります。
trlkly

9

Windowsエクスプローラーでフラット化するには、フラット化System.Kind:<>folderするフォルダーに移動して検索し、結果からフォルダーを除外します。

その後、CTRL + Aを使用してすべてのファイルを選択し、コピーして新しいフォルダーに貼り付けます。Windowsエクスプローラーは、重複したファイル名を処理する方法を尋ねることに注意してください。

ここに画像の説明を入力してください


1
これを機能させるには、対応するローカライズされた翻訳に「フォルダ」と入力する必要があることに注意してください(たとえば、イタリア語ではSystem.Kind:<>cartella
-JohnKiller

0

この種のことは、Unixシェルでは簡単です。ここに、私自身のハミルトンCシェル無料版を含む)でできることを示します。Cygwinbashでも非常によく似たことができます。

mv *\* .

ディレクトリが非常に大きい場合、Windowsが子プロセスに渡すには長すぎるコマンドラインにワイルドカードを使用する可能性があります。(Windows CreateProcess呼び出しは、引数リストを32K Unicode文字に制限します。)しかし、Cシェルは内部的に制限がないため、この方法でリスト全体を反復処理できます。

foreach i ( *\* )
   mv $i .
end

上記の@MarkAllenのポイントに、この種の重複名がないことを前提としています。存在する場合、リスト内の後のコピーが古いコピーを上書きします。それが懸念される場合は、ファイルを繰り返し処理し、mv上書きしない場合にのみそれらを処理することができます。:tオペレータは、テール演算子-eオペレータは、あるファイルがテストに存在します

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

これにより、空のディレクトリが残りますが、空になった後は不要になる可能性があります。それが重要な場合、それは次の繰り返しになる可能性があります。


cygwin> mv *を使用します。MV:できないのstat `*「:そのようなファイルやディレクトリ
つ以上の

Cygwin bashではmv */* .、私のために機能します。
ニコールハミルトン

3
UNIXismに固執している人もいます。Windows7でスクリプトを作成したい場合、PowerShellがあれば、Cygwinのような偽のbashシミュレータは必要ありません。

PowerShellも必要ありません。通常のコマンドラインはまだ存在し、同じことを実行できます。以下の私の答えをご覧ください。
trlkly 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.