将具有确切名称的多个文件夹移动到它自己的父文件夹

Move multiple folders with exact name to it's own parent folder

我有这样的文件结构:

folder
+---a
|   \---b
|       \---foo bar
+---c
|   \---d
|       \---foo bar
+---.
\---.

我想使用 .

foo bar 移动到它自己的父文件夹

我在 中试过这个,但它说:

The syntax of the command is incorrect.
cd "path to folder"
for /r %x in (foo bar) do move "%x" ".."

编辑

我已将我的命令更改为:

for /r %x in ("foo bar") do move "%x" "%~px.."

但是现在报错了,因为这里foo和bar之间有space:("foo bar"),怎么办?使用 foo?bar 而不是 "foo bar" 也许?

编辑 2

我最后的命令:

for /d /r %x in ("?oo bar") do if "%~nx"=="foo bar" move "%x" "%~px.."

我没有使用 (*),因为如果您有数百个文件夹,它会大大增加命令执行时间,因为它必须检查每个文件夹的名称。

感谢大家的帮助

for /r /d %A in (*) do if /i "%~nxA" == "foo bar" move /y "%~A" "%~dpA.."

* 用作 (set)。如果您查看 for /?,您可能会看到:

(set) Specifies a set of one or more files. Wildcards may be used.

所以,(set) 是文件,不是文件夹。

理想情况下,为 for 变量使用一个不是修饰符字母的字母。 x表示扩展修饰符。

%~nxA 将是当前文件夹名称并检查是否为 foo bar.

如果 move 失败且 foo bar 已存在,则拒绝访问以警告其存在。

如果在批处理文件中使用,将 % 个字符加倍为 %%

备用循环:

for /f "delims=" %A in ('dir /b /s /a:d "*foo bar"') do if /i "%~nxA" == "foo bar" move /y "%~A" "%~dpA.."

在循环开始之前获取路径以避免多次移动同一文件夹。

我已经包含了以下示例,不使用递归,并且使用 RoboCopy 进行移动操作。 RoboCopy 的好处是能够合并目录,overwrite/or 否则,(取决于您选择的选项),如果有任何冲突。

如果您只是移动具有特定名称的目录,例如foo bar 那么以下 可能会有所帮助:

(PushD "folder"&&(For /D %G In (*)Do @For /D %H In ("%G\*") Do @RoboCopy "%H\foo bar" "%G\foo bar" /E /Move)&PopD)>NUL 2>&1

如果您要将所有目录从 folder 下三层向上移动一层,而不管它们的名称如何,那么这也许就足够了。

(PushD "folder"&&(For /D %G In (*)Do @For /D %H In ("%G\*") Do @For /D %I In ("%H\*")Do @RoboCopy "%I" "%G\%~nxI" /E /Move)&PopD)>NUL 2>&1

请注意,没有包含任何检查来确定包含您的目标的二级目录现在是否为空。如果是,并且您希望删除它们,则需要扩展命令行,或根据需要添加新的命令行。