サブフォルダー内のすべてのファイルを親フォルダーに移動する


0

最初に、私は同じような質問がたくさんあることを知っています。少なくとも5つを適応させなければならなかったので知っていますが、私はまだCMDをよく理解していないのでここに質問していますこの時点までは)一般的で役に立たないエラーでイライラしており、構文のどの部分が間違っているのか理解できません。これはおそらく、他の質問がそれぞれのOPのフォルダー/ファイル名構造を扱っているという事実によるものであり、コードを自分のフォルダー/ファイル構造に適合させようとすると動作しません。したがって、私はここforで、自分のファイルおよびフォルダー構造で実際に機能するCMD ループソリューションを求めています。

他の多くのフォルダーを含む親フォルダーがあり、そこにはファイルがあります:

Parent Folder
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2
     Subfolder
           File1
           File2

...等々。

コマンドとfor組み合わせてCMD ループを使用moveして、サブフォルダー内のすべてのファイルを親フォルダーに抽出し、各サブフォルダーを空のままにしたいと考えています。

CMD forループを与えるときは、コマンドの各部分が何をしているのかを分解してください。これにより、コードを理解し、うまくいけば自分で動作するようになるトラブルを最小限に抑えることができます。


dir /s/b >a.a 行ごとにすべてのファイルのリストを取得した場合はどうなりますか。その後move 、各行の先頭に、およびc:\blah\myparentfolder各行の終わりには、次のコマンドのリストを持っているし、ファイルblah.batに名前を付け、それを実行することができます
barlop

回答:


2

さて、私はついに、さらに別の質問からのコードを適合させることによってそれを理解しました。この答えに対するコメントで私が確信できなかった部分を明確にしてくれた@AFHと、それに対する彼の全般的な助けに感謝します。

すべてのファイルをサブフォルダーから親フォルダーに抽出するには

for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER"

のすべてのインスタンスをPARENTFOLDER、ファイルを抽出するフォルダーへのパスに置き換えてください。

サブフォルダーからすべてのファイルを抽出し空のサブフォルダー削除するには

空のサブフォルダーをファイルから抽出した後に残しておく必要はほとんどありません-私は確かにしませんでした-したがって、以下のコマンドもそれらの削除を自動化します。

for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER" && cd "PARENTFOLDER" && for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

もう一度、すべてのインスタンスをPARENTFOLDER、ファイルを抽出するフォルダーへのパスに置き換えます。

ただし、この時点では1行ではなく、コマンドラインに貼り付けると少し複雑になり始めるので、すべてをバッチファイルに入れる方が簡単です。親フォルダーへのパスに変数を使用するPARENTFOLDERと、ファイルの先頭にある1つのインスタンスのみを置き換えることができます。また、より安全なオプションであり、保持したい空のフォルダーを誤って削除することを防ぎます。

バッチファイル

テキストファイルに貼り付けPARENTFOLDER、使用するフォルダーのパスに置き換えて、拡張子を付けて保存し.batます。任意のディレクトリで実行します。

@ECHO OFF
SETLOCAL
SET parent="PARENTFOLDER"
CD /d %parent% 
FOR /r %parent% %%d IN (*.*) DO MOVE "%%d" %parent% 
FOR /f "delims=" %%d IN ('DIR /a:d /s /b ^| SORT /r') DO RD "%%d"
ECHO Done. Press any key to terminate script.
PAUSE >NUL

1
forコマンド構文は合理的ではないが、最初の%d定義dループ変数として、2つ目は%d(Unixの構文がより合理的である:ループ変数がループの各パス上に展開されるものですfor ... d in ... do ...)。最初のインスタンスは展開されないため、空白の埋め込まれたファイル名に展開さdoれる%d可能性があるの後とは異なり、引用符で囲む必要はありません。特別なことは何もありませんd:任意の1文字を使用できますがd、ディレクトリ(またはfファイル)にとって論理的です。さらに非合理的に%%dは、バッチ(.cmdまたは.bat)ファイルで使用する必要があります。
AFH

1
テストせずにfor、に沿ってネストされたが欲しいと思いますfor /d %d in (PARENTFOLDER\*) do for /r "%d" %f in (*.*) do move "%f" TARGETLOCATION。追加の要件を質問に含める場合は、他の人のために回答を送信します。
AFH

1
PARENTFOLDER空白が含まれる場合は、引用符で囲む必要があります。ネストされたコマンドが実行されることを正確に確認するためにecho、最初doと2番目の間に置くことをお勧めします。お客様の条件には非常に多くのバリエーションがあるため、ここでは代表的なテストを設定できません。forfor
AFH

1
引用符を付けずにPARENTFOLDER次のようにするname with spacesと、最初のものforがとして評価されるfor /d %d in (name with spaces\*) do ...ため、d連続してnameとなりwith、次にmaskに一致するすべてのファイルになりますspaces\*。括弧は、引用の要件を止めるものではありません。引用する必要がないのは、cdコマンドを使用するときだけです。このコマンドは、スペースを含む行の残りを単一のパラメーターとして使用します(ただし、Tab拡張は引用符を挿入します)。mdそしてrd複数のディレクトリに作用し、その名前にスペースを持っている場合は、引用符を必要とすることができます。
AFH

1
解決できてうれしいです。
AFH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.