如何复制目录结构但仅包含某些文件(使用windows批处理文件)

如何复制目录结构但仅包含某些文件(使用windows批处理文件),windows,batch-file,cmd,robocopy,Windows,Batch File,Cmd,Robocopy,正如标题所说,如何递归复制目录结构,但只包含一些文件。例如,给定以下目录结构: folder1 folder2 folder3 data.zip info.txt abc.xyz folder4 folder5 data.zip somefile.exe someotherfile.dll xcopy *.txt /s G: 文件data.zip和info.txt可以出现在目录结构中的任何位置

正如标题所说,如何递归复制目录结构,但只包含一些文件。例如,给定以下目录结构:

folder1
  folder2
    folder3
      data.zip
      info.txt
      abc.xyz
    folder4
    folder5
      data.zip
      somefile.exe
      someotherfile.dll
xcopy *.txt /s G:
文件data.zipinfo.txt可以出现在目录结构中的任何位置。如何复制完整的目录结构,但仅包含名为data.zip和info.txt的文件(应忽略所有其他文件)

生成的目录结构应如下所示:

copy_of_folder1
  folder2
    folder3
      data.zip
      info.txt
    folder4
    folder5
      data.zip

您没有提到它是否必须是批处理的,但是如果您可以使用
ROBOCOPY
,请尝试以下操作:

ROBOCOPY C:\Source C:\Destination data.zip info.txt /E
编辑:将
/S
参数更改为
/E
,以包含空文件夹

XCOPY /S folder1\data.zip copy_of_folder1  
XCOPY /S folder1\info.txt copy_of_folder1

编辑:如果你想保留空文件夹(在重读文章时,你似乎会使用/E而不是/S)。

这只是两个简单的命令,但我不建议这样做,除非你不需要复制的文件很小。这是因为这将复制所有文件,然后删除副本中不需要的文件

xcopy /E /I folder1 copy_of_folder1
for /F "tokens=1 delims=" %i in ('dir /B /S /A:-D copy_of_files ^| find /V "info.txt" ^| find /V "data.zip"') do del /Q "%i"
当然,第二个命令有点长,但它可以工作


此外,这种方法不需要您下载和安装任何第三方工具(Windows 2000+BATCH有足够的命令用于此操作)。

类似于Paulius的解决方案,但您不关心的文件不会复制然后删除:

@echo OFF

:: Replace c:\temp with the directory where folder1 resides.
cd c:\temp

:: You can make this more generic by passing in args for the source and destination folders.
for /f "usebackq" %%I in (`dir /b /s /a:-d folder1`) do @echo %%~nxI | find /V "data.zip" | find /v "info.txt" >> exclude_list.txt
xcopy folder1 copy_of_folder1 /EXCLUDE:exclude_list.txt /E /I

一次复制一个文件且不需要ROBOCOPY的替代解决方案:

@echo off
setlocal enabledelayedexpansion

set "SOURCE_DIR=C:\Source"
set "DEST_DIR=C:\Destination"
set FILENAMES_TO_COPY=data.zip info.txt

for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
    if exist "%%F" (
        set FILE_DIR=%%~dpF
        set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
        xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
    )
)

outer for语句生成
SOURCE\u DIR
中的子目录和
FILENAMES\u TO\u COPY
中的名称的任何可能路径组合。对于每个现有文件,都会调用xcopy
FILE\u INTERMEDIATE\u DIR
SOURCE\u DIR
中保存文件的子目录路径,该路径需要在
DEST\u DIR
中创建。要使用拖放操作,请使用winzip。有一个DIR structure preserve选项。只需在目录级别创建一个新的.zip文件,它将成为您的根目录,并将文件拖入其中。

感谢前面的答案。:)

此脚本名为“r4k4copy.cmd”:

它接受变量“Source”、“Destination”和“FileName”。 它还只能复制指定类型的文件或选择性文件名

欢迎任何改进。:)

尝试将find(即文件路径)的输出管道化到cpio中

find . -type f -name '*.jpg' | cpio -p -d -v targetdir/
cpio检查目标文件上的时间戳——因此它既安全又快速


一旦习惯了,删除-v可以加快操作速度。

在Linux和其他UNIX系统下,使用
tar
命令可以很容易地做到这一点

$ tar cvf /tmp/full-structure.tar *data.zip *info.txt
然后,您将cwd发送到目标并:

$ tar xvf /tmp/full-structure.tar 
当然,您可以通过管道将第一个tar的输出传输到第二个tar,但是看到它分步工作更容易理解和解释。我在下面的命令中缺少了必要的cd/to/new/path/,我现在不记得该怎么做了。希望其他人可以添加它

$ tar cvf -  *data.zip *info.txt |  tar xvf - 
Tar(gnutar)也可以在Windows上使用,但我可能会在该平台上自己使用
xcopy
方法。

仅使用find和cp:

mkdir /tmp/targetdir
cd sourcedir
find . -type f -name '*.zip' -exec cp -p --parents {} /tmp/targetdir ";"
find . -type f -name '*.txt' -exec cp -p --parents {} /tmp/targetdir ";"

对于使用(2个面板文件管理器)的用户:在复制弹出窗口的选项中,只需指定文件名或掩码。简单。

我对正则表达式很在行,懒惰,不喜欢安装,所以我创建了一个批处理文件,用普通的DOS命令创建目录和副本。看起来很辛苦,但对我来说比做机器人技术要快

  • 在文本文件中创建包含完整路径的源文件列表,包括驱动器号(如果为nec)
  • 在文本编辑器中打开正则表达式
  • 如果是空格,请在每行的周围添加双引号-搜索字符串
    (.*)
    替换字符串
    “\1”
    ,然后单击“全部替换”
  • 每个文件创建两行-一行用于创建目录,一行用于复制文件(qqq将替换为目标路径)-搜索字符串
    (.*)
    replace string
    md qqq\1\nxcopy\1 qqq\1\n
    并单击全部替换
  • 从目标路径中删除文件名–搜索
    \\([^\\^“]+)”\n
    替换
    \\”\n
  • 在目标路径中替换(在本例中为
    A:\src
    B:\dest
    )。关闭正则表达式,搜索
    qqq“A:\src\
    替换
    B:\dest\
    ,然后单击全部替换
  • md将创建嵌套目录。在本例中,copy的行为可能与xcopy相同。您可能希望将/Y添加到xcopy以禁止覆盖确认。最终会得到一个批处理文件,如下所示:

    md "B:\dest\a\b\c\"
    xcopy "C:\src\a\b\c\e.xyz" "B:\dest\a\b\c\e.xyz"
    

    对原始列表中的每个文件重复。在Win7上测试。

    如果Powershell是一个选项,您可以执行以下操作:

    Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse
    

    主要缺点是它会复制所有文件夹,即使这些文件夹最终为空,因为没有文件与您指定的筛选器匹配。因此,除了少数几个包含所需文件的文件夹外,最终可能会出现一棵满是空文件夹的树。

    使用WinRAR命令行界面,您可以将文件名和/或文件类型复制到存档中。然后,您可以将该归档文件提取到您喜欢的任何位置。这将保留原始文件结构

    我需要将丢失的相册图片文件添加到手机中,而无需重新复制音乐本身。幸运的是,我的电脑和手机上的目录结构是相同的

    我用过:

       rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
    
    • C:\Downloads\music.rar=要创建的存档
    • X:\music\=包含音乐文件的文件夹
    • Folder.jpg=我要复制的文件名
    这将在适当的子目录中创建一个包含所有Folder.jpg文件的存档

    这种技术也可用于复制文件类型。如果所有文件都有不同的名称,您可以选择将所有文件解压缩到单个目录。其他命令行参数可以归档多种文件类型


    有关将所有文本文件复制到G:并保留目录结构的详细信息,请参见此非常有用的链接:

    folder1
      folder2
        folder3
          data.zip
          info.txt
          abc.xyz
        folder4
        folder5
          data.zip
          somefile.exe
          someotherfile.dll
    
    xcopy *.txt /s G:
    

    它不保留文件夹结构。t