【问题标题】:Move multiple folders with exact name to it's own parent folder将具有确切名称的多个文件夹移动到它自己的父文件夹
【发布时间】:2020-05-24 02:39:14
【问题描述】:

我有这样的文件结构:

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 之间有空格:("foo bar"),我该怎么办?使用foo?bar 代替"foo bar" 可能吗?

编辑 2

我的最终命令:

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

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

感谢大家的帮助

【问题讨论】:

  • for /r %x in ("foo bar") do move "%x" "%~px.." 我已经把我的命令改成了这个,但现在它给出了错误,因为有引号在这里:(“foo bar”)我该怎么办?用 foo?bar 代替“foo bar”吧?
  • 在同一目录folder 中不能有两个名为foo bar 的目录。如果您的问题保持了您打算向我们展示的结构,您还可以确认我的大量编辑吗?
  • 正如已经指出的那样,如果您尝试将两个文件夹都上移一级到同一级别,则会发生冲突。但是您还通过FOR /R 命令学到了一个小怪癖。如果你没有发生碰撞,你可以这样做:for /D /r %G IN ("foo ba?") do if /i "%~nxG"=="foo bar" move "%G" ..
  • for /r %x in ("foo bar*") do @ECHO move "%x" "%~px.." 开头 - 您必须for /r … 循环中使用通配符。此外,调试时使用ECHO move …
  • @Compo 不,这是错误的结构。 b 在 a 文件夹中,d 在 c 文件夹中。

标签: batch-file command-line batch-file command-line move subdirectory


【解决方案1】:

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

如果您只是移动具有特定名称的目录,例如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

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

【讨论】:

    【解决方案2】:
    for /r /d %A in (*) do if /i "%~nxA" == "foo bar" move /y "%~A" "%~dpA.."
    

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

    (set) 指定一组一个或多个文件。可以使用通配符。

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

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

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

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

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

    备用循环:

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

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

    【讨论】:

    • (set) 也是文件夹。 /d 仅指定在使用通配符时匹配文件夹。所以当没有通配符时不需要它。除此之外,感谢x 提示
    • 我应该警告for /r 迭代,并且由于实时完成的迭代,同一个移动的文件夹可能会再次移动。因此,for /f 使用 dir 可以在开始循环之前缓存路径,这可能有助于避免移动同一文件夹。添加了答案的替代方案。
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多