将具有确切名称的多个文件夹移动到它自己的父文件夹
Move multiple folders with exact name to it's own parent folder
我有这样的文件结构:
folder
+---a
| \---b
| \---foo bar
+---c
| \---d
| \---foo bar
+---.
\---.
我想使用 batch-file.
将 foo bar
移动到它自己的父文件夹
我在 command-line 中试过这个,但它说:
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
那么以下 command-line 可能会有所帮助:
(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
请注意,没有包含任何检查来确定包含您的目标的二级目录现在是否为空。如果是,并且您希望删除它们,则需要扩展命令行,或根据需要添加新的命令行。
我有这样的文件结构:
folder +---a | \---b | \---foo bar +---c | \---d | \---foo bar +---. \---.
我想使用 batch-file.
将foo bar
移动到它自己的父文件夹
我在 command-line 中试过这个,但它说:
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
那么以下 command-line 可能会有所帮助:
(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
请注意,没有包含任何检查来确定包含您的目标的二级目录现在是否为空。如果是,并且您希望删除它们,则需要扩展命令行,或根据需要添加新的命令行。