【问题标题】:Move up all files one level recursively递归地将所有文件上移一级
【发布时间】:2018-02-02 08:16:50
【问题描述】:

我想递归地将所有文件上移一级。

当前文件夹结构如下所示

D:\_Courses>tree /a
D:.
+---Course 1
|   \---Download
+---Course 2
|   \---Download
+---Course 3
|   \---Download
\---Course 4
    \---Download

我想将所有文件从“下载”文件夹移动到其父文件夹。

意思是,

“课程 1/下载”中的所有文件都应转到“课程 1”

“Course 2/Download”中的所有文件都应转到“Course 2”

“课程 3/下载”中的所有文件都应转到“课程 3”

“Course 4/Download”中的所有文件都应转到“Course 4”

问题1:显示一个不存在的文件夹

当我使用以下命令时

D:\_Courses>FOR /R /D %I IN (Download\) DO @ECHO %I

输出如下

D:\_Courses\Download\
D:\_Courses\Course 1\Download\
D:\_Courses\Course 1\Download\Download\
D:\_Courses\Course 2\Download\
D:\_Courses\Course 2\Download\Download\
D:\_Courses\Course 3\Download\
D:\_Courses\Course 3\Download\Download\
D:\_Courses\Course 4\Download\
D:\_Courses\Course 4\Download\Download\

但是,没有文件夹调用

D:\_Courses\Course 1\Download\Download

问题 2:移动到错误的目录

当我给出以下命令时

D:\_Courses>FOR /R /D %I IN (Download\) DO move "%I"*.* ..

将所有 4 个下载文件夹中的所有文件移至 D:

输出是 -

D:\_Courses>move "D:\_Courses\Download\"*.* ..
The system cannot find the file specified.

D:\_Courses>move "D:\_Courses\Course 1\Download\"*.* ..
D:\_Courses\Course 1\Download\518057_00_01.mp4
D:\_Courses\Course 1\Download\518057_00_02.mp4
D:\_Courses\Course 1\Download\518057_00_03.mp4
...
       28 file(s) moved.

D:\_Courses>move "D:\_Courses\Course 1\Download\Download\"*.* ..
The system cannot find the file specified.

D:\_Courses>move "D:\_Courses\Course 2\Download\"*.* ..
D:\_Courses\Course 2\Download\486757_00_01.mp4
D:\_Courses\Course 2\Download\486757_00_02.mp4
D:\_Courses\Course 2\Download\486757_00_03.mp4
D:\_Courses\Course 2\Download\486757_00_04.mp4
...
       40 file(s) moved.

D:\_Courses>move "D:\_Courses\Course 2\Download\Download\"*.* ..
The system cannot find the file specified.

D:\_Courses>move "D:\_Courses\Course 3\Download\"*.* ..
D:\_Courses\Course 3\Download\569336_00_01.mp4
D:\_Courses\Course 3\Download\569336_00_02.mp4
D:\_Courses\Course 3\Download\569336_00_03.mp4
D:\_Courses\Course 3\Download\569336_01_01.mp4
D:\_Courses\Course 3\Download\569336_01_02.mp4
...
       19 file(s) moved.

D:\_Courses>move "D:\_Courses\Course 3\Download\Download\"*.* ..
The system cannot find the file specified.

D:\_Courses>move "D:\_Courses\Course 4\Download\"*.* ..
D:\_Courses\Course 4\Download\518056_00_01.mp4
D:\_Courses\Course 4\Download\518056_00_02.mp4
D:\_Courses\Course 4\Download\518056_00_03.mp4
...
       17 file(s) moved.

D:\_Courses>move "D:\_Courses\Course 4\Download\Download\"*.* ..
The system cannot find the file specified.

【问题讨论】:

  • 那么你想把所有子目录下的所有文件都移到根目录下吗?还是仅来自给定路径?
  • @GerhardBarnard 这只是文件夹结构的模式。如果存在名为 Download 的文件夹,我想将其上移一级。我正在做。以下命令 FOR /R /D %I IN (Download) DO move "%I". "%I"\.. 似乎有效。请您检查并确认。谢谢
  • 啊好的,现在我得到了你想要的。忽略之前的评论
  • FOR /R /D %I IN (下载) DO move "%I"*.* "%I"\..
  • 如果存在同名文件会怎样?

标签: batch-file cmd


【解决方案1】:

好的,这应该可以满足您的需求。

@echo off
for /r /d %%a in (Download) do (
echo move "%%a\*" "%%a\.."
)

只有在您满意时才删除回显,回显时结果看起来不错。

请注意放置批处理文件的位置,因为它会从批处理文件的根目录递归搜索所有名为Download 的目录。还要确保批处理文件不存在于名为Download的目录中

编辑:从 cmdline 而不是批处理运行(确保完全复制代码):

for /r /d %a in (Download) do (echo move "%a\*" "%a\..")

【讨论】:

  • for /r /d %a in (Download) do move "%a*.*" "%a\.." 该命令工作正常,但问题是 "D:_Courses>move " D:_Courses\Course 4\Download\Download*.*" "D:_Courses\Course 4\Download\Download\.." 系统找不到指定的文件。"我的目录结构中没有任何名为“D:_Courses\Course 4\Download\Download”的文件夹。这是什么问题。
  • @blueray 是,如果来自 cmdline,但如果来自批处理文件,则添加 %%a
  • 请记住,您有一个 batch-file 标签,因此是 batch-file 答案:)
  • @blueray,在您上面的评论中,您使用了move "%a 而不是move "%a\
  • @blueray 您是否完全复制了我的代码?请准确复制并创建一个批处理文件,否则如果您想从 cmdline 运行,请参阅我的答案底部的编辑。
【解决方案2】:

复制自this answer:

您可以在 Batch 中编写递归算法,让您精确控制在每个嵌套子目录中的操作:

@echo off
call :treeProcess
goto :eof

:treeProcess
rem Do whatever you want here over the files of this subdir, for example:
move *.* ..
for /D %%d in (*) do (
    cd "%%d"
    call :treeProcess
    cd ..
)
exit /b

【讨论】:

  • 请注意;我有一个偷偷摸摸的怀疑,尽管有批处理文件标签,他们是直接从 cmd.exe 窗口运行的。
【解决方案3】:

此 PowerShell 脚本使用目录和文件对象 Parent 属性来复制文件。当您确信正确的文件将被复制到正确的目标位置时,请从 Move-Item cmdlet 中删除 WhatIf

Get-ChildItem -Directory -Path C:/src/t/_Courses -Recurse -Filter 'Download' |
    ForEach-Object {
        $newdir = $_.Parent.FullName
        Get-ChildItem -File -Path $_.FullName |
            ForEach-Object { Move-Item -LiteralPath $_.FullName $newdir -WhatIf }
    }

要在 cmd shell 中使用它,请将上面的代码放入 movedowns.ps1 等文件中,然后运行它。

powershell -NoProfile -File movedowns.ps1

【讨论】:

    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多