如何使用CMD将所有子目录中特定扩展名的文件移动到它们的父目录?

25

文件夹c:\folder1包含subfolder1subfolder2等。

这些子目录包含.pdf.db文件。

如何使用Windows命令解释器将所有.pdf文件移动到c:\folder1中?


1
你是否打算使用特定的编程语言来完成这个任务? - THE DOCTOR
抱歉,我应该提到这一点。在MS-DOS中使用CMD。 - mihai
11个回答

38

这对我起作用:

.bat / .cmd 文件中:

for /r "c:\source_directory\" %%x in (*.pdf) do move "%%x" "c:\target_directory\"

如果需要直接在命令提示符窗口(而非PowerShell)中输入:

for /r "c:\source_directory\" %x in (*.pdf) do move "%x" "c:\target_directory\"

这个命令将递归复制源目录(包括其所有子目录)中的所有*.pdf文件到目标目录。

如果要排除子目录中的文件,请省略/r开关。

希望对您有所帮助。


6
%x 是足够的,%%x 用于批处理文件。 - Floni
我认为 for /r "b:\" %x in (*.mp3) do copy "%x" "c:\temp\cdrw" 可以工作,但不确定它是否处理子文件夹。 - Ryan
有没有一种方法可以自动覆盖/保留所有重复的命名文件,而不需要回答每个“是/否/全部”对话框? - Thunder_Ruler
@Thunder_Ruler 如果回答为 a(代表“全部”),将会覆盖所有内容,但我不知道如何选择覆盖所有内容的选项。 - Dai

7

外层的for循环列出当前工作目录中的子目录,内层的for循环列出要移动到目标路径的子目录:

for /d %f in (*.*) do for /d %e in (%f\*.*) do move "%e" DestinationPath

如果DestinationPath不是工作目录的子文件夹,则此方法效果最佳,因为它会尝试将DestinationPath移动到自身。

在全面运行命令之前确认命令,可以先像下面这样仅回显最终的移动命令:

for /d %f in (*.*) do for /d %e in (%f\*.*) do echo move "%e" DestinationPath

复制并粘贴其中一种结果以运行并确认它按照您的期望工作。然后删除回显并开始动手。


如果子目录名称中有空格,则此方法无法正常工作。 - Will Sheppard

7

在Windows资源管理器中(GUI,非命令提示符),还有另一种方法可以完成此操作:

  • 导航到顶级目录
  • 在右上方的搜索框中输入*.pdf并点击搜索
  • 选择所有文件并将它们拖到顶级文件夹
  • 回答任何关于覆盖文件的提示

小文件的好主意。我正在尝试使用它处理10万个文件,但这种方法会导致程序卡死。 - Gabriel Fair
这对于来自约10个目录的几百个文件非常有效。我认为当您有许多位置时,即使只有少量文件,这也特别有用。 - StayOnTarget

5

我认为在子文件夹中没有通配符适用,因此您需要使用循环来遍历每个子文件夹并移动*.pdf文件:

FOR /R [您的根文件夹路径] %%G IN (*.pdf) DO move %%G [新路径]

DO后面的命令本身就带有引号。如果您预期源目录或目标目录中会有空格,请使用双引号将它们封装起来,例如:

FOR /R "源目录路径带有空格" %%G IN (*.pdf) DO move "%%G" "目标目录路径带有空格"

请注意,在%%G周围加上引号是必需的,以使move命令能够解析路径。

**编辑:针对被接受的答案所做的回应,以下分别是Windows XP和Windows 7上的命令提示符:

command prompts

这表明通配符不适用于路径,只适用于单个目录中的文件(例如C:\ folder* .files)。当命令提示符遇到通配符时,它不会进行递归操作。


这将遍历所有子文件夹,顺便说一下,并不仅限于第一个分支。 - Eaglebird
从WinXP和Win7的提示:(错误发布,请忽略此内容) - Eaglebird
你是正确的,海报想要一个递归解决方案,我误读了。 - THE DOCTOR
2
谢谢Eaglebird,我尝试了你的解决方案,但是出现了“%%G was unexpected at this time”的错误。我本想上传截图,但不知道该怎么做。 - mihai
尝试在问题中上传图像,但该控件似乎在IE 7.0中无法正常工作。 - mihai
直到我将其更改为单个%G,我才不再出现错误。 - Sohail Ahmed

4

我知道这已经很晚了,但如果有人需要的话,以下内容可能会有所帮助。

使用以下命令可以搜索所有子文件夹中的.MKV文件,并将它们移动到批处理文件所在的当前目录。

FOR /D /r %%F in ("*") DO (
    pushd %CD%
    cd %%F
        FOR %%X in (*.mkv) DO (
            move "%%X" "%CD%"
        )
    popd
)

3

Robocopy对我来说很有帮助:

 robocopy c:\cache c:\cache-2012 ?????-2012*.hash /S /MOV

我使用它将带有特定掩码的所有文件移出c:\cache及其众多子目录。


你说“移动所有文件”,但你的意思是“复制”,对吧? - Gabriel Fair
/ MOV 在复制后删除源文件 - Adam Spriggs

3
MOVE "C:\FOLDER 1\PDF FILES\*.pdf" "C:\FOLDER 1"
MOVE "C:\FOLDER 1\DB FILES\*.db" "C:\FOLDER 1"

在移动命令后,您需要指定源文件夹和文件将要被移动到的目标位置。每个文件扩展名前面的星号是通配符功能,将选择该目录中存在的所有指定文件类型。
此外,如果您想创建一个包含这些命令的.bat文件,可以这样做:将命令粘贴到记事本中,然后将其保存为.bat而不是.txt
然后,每次双击该文件时,它都会执行文件中的命令。如果您有任何需要重复执行的任务,这非常有用。

2

我只是猜测一下,但如果我没记错的话,DOS可以处理通配符,相当于mv的命令是MOVE,所以:

MOVE C:\FOLDER1\*\*.PDF C:\FOLDER1\


我尝试执行 copy B:\*\*.* C:\temp\cdrw\ 命令,但是出现了以下错误:文件名、目录名或卷标语法不正确。 - Ryan

2
@echo on

for /r "F:\All_drawings\newdrg\" %%x in (*.tiff) do move "%%x" "F:\Alldrawings"

pause

{将newdrg文件夹及其“子文件夹”中的所有文件移动到目标文件夹Alldrawings,此命令适用于批处理文件操作,对于命令行使用,在两个位置上都使用单个“%”符号}。


1
将所有文本文件复制到一个文件夹并保留目录结构的方法是:

xcopy *.txt /s D:Folder


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接