回答:
特別なツールやスクリプトを使用する理由はありません。エクスプローラーで検索機能を使用するだけです。
*、Enterキーを押します。スクリプトを作成して、それを開始して忘れることができるようにしたい場合は、それも実行できます。置換するコマンド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"
スクリプトを使用するには、単純化するフォルダーをその上にドラッグします。
Windowsエクスプローラーでフラット化するには、フラット化System.Kind:<>folderするフォルダーに移動して検索し、結果からフォルダーを除外します。
その後、CTRL + Aを使用してすべてのファイルを選択し、コピーして新しいフォルダーに貼り付けます。Windowsエクスプローラーは、重複したファイル名を処理する方法を尋ねることに注意してください。
System.Kind:<>cartella)
この種のことは、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
これにより、空のディレクトリが残りますが、空になった後は不要になる可能性があります。それが重要な場合、それは次の繰り返しになる可能性があります。
bashではmv */* .、私のために機能します。