如何复制一个目录结构,但仅仅包括某些文件(使用windows批处理的文件)

StackOverflow https://stackoverflow.com/questions/472692

正如标题所说,我怎么可以递归的复制一个目录结构,但仅仅包括一些文件。例如给定的以下目录的结构:

folder1
  folder2
    folder3
      data.zip
      info.txt
      abc.xyz
    folder4
    folder5
      data.zip
      somefile.exe
      someotherfile.dll

该文件 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包括空文件夹

其他提示

一种替代的解决方案,用于将文件复制在一个时间,并且不需要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!"
    )
)

for语句的外产生在SOURCE_DIR FILENAMES_TO_COPY和子目录名称的任何可能的路径组合。对于每一个现有的文件XCOPY被调用。 FILE_INTERMEDIATE_DIR保持SOURCE_DIR这就需要在DEST_DIR要创建内的文件的子目录路径。

尝试管道查找的输出(即,文件路径)转换成的cpio

find . -type f -name '*.jpg' | cpio -p -d -v targetdir/

的cpio检查时间戳目标文件 - 因此其安全,快速

删除-v更快的运算,一旦你习惯了它。

如果PowerShell是一个选项,你可以这样做:

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

主要缺点是它会将所有的文件夹,即使他们最终会是空的,因为没有文件匹配您指定的过滤。所以,你可以有一个完整的空文件夹的树状结束,除了有你想要的文件的几个文件夹。

由于以前的解答。 :)

此脚本名为 “r4k4copy.cmd”:

@echo off
for %%p in (SOURCE_DIR DEST_DIR FILENAMES_TO_COPY) do set %%p=
cls
echo :: Copy Files Including Folder Tree
echo :: http://stackoverflow.com
rem     /questions/472692/how-to-copy
rem     -a-directory-structure-but-only
rem     -include-certain-files-using-windows
echo :: ReScripted by r4k4
echo.
if "%1"=="" goto :NoParam
if "%2"=="" goto :NoParam
if "%3"=="" goto :NoParam
setlocal enabledelayedexpansion
set SOURCE_DIR=%1
set DEST_DIR=%2
set FILENAMES_TO_COPY=%3
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!"
)
)
goto :eof
:NoParam
echo.
echo Syntax: %0 [Source_DIR] [Dest_DIR] [FileName]
echo Eg.   : %0 D:\Root E:\Root\Lev1\Lev2\Lev3 *.JPG
echo Means : Copy *.JPG from D:\Root to E:\Root\Lev1\Lev2\Lev3

它接受“源”,“目的地”和“文件名”的变量。 它也可以仅复制指定的类型的文件或选择性的文件名。

的任何改进是受欢迎的。 :)

使用仅查找和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 ";"

要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

这只是两个简单的命令,但是我不会推荐,除非你不需要复制的文件很小。这是因为这将复制所有文件,然后删除未在复制所需的文件。

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+批有足够的命令为这个)。

在Linux等UNIX系统上,使用tar命令将执行此容易。

$ tar cvf /tmp/full-structure.tar *data.zip *info.txt

然后,你CWD到目标和

$ tar xvf /tmp/full-structure.tar 

当然你可以管,从第一到焦油第二输出,但看到它在步骤的工作更容易理解和解释。我缺少必要的CD /到/新/路径/下面的命令 - 我只是不记得怎么现在就这样做。别人可以添加它,希望。

$ tar cvf -  *data.zip *info.txt |  tar xvf - 

焦油(gnutar)是适用于Windows太多,但我可能会使用xcopy方法自己在该平台上。

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

编辑:如果您想保留的空文件夹(其中,在重读你的文章,你似乎)使用/ E来代替/ S

使用压缩命令线路接口,可以复制文件的名称和/或文件的类型,以存档。然后你就可以提取存档的任何你喜欢的位置.这保留了原始文件的结构。

我需要增添缺失的专辑画面的文件到我的移动电话,而无需重新复制音乐本身。幸运的是,该目录的结构是一样在我的计算机和移动!

我的使用:

   rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
  • C:\Downloads\music.rar =存档,以创建
  • X:\music\=文件夹中包含音乐文件
  • Folder.jpg =Filename我想要复制

这创造了一个存档的所有Folder.jpg 文件在适当的子目录。

这种技术可用于复制文件的类型。如果文件有不同的名字,你可以选择提取所有文件的一个单一目录。其他命令行参数可以归档文件类型。

更多的信息,在这个非常有用的链接 http://cects.com/using-the-winrar-command-line-tools-in-windows/

有关使用这些 Altap蝾(2个面板文件管理器):在复印弹出的选项,只要指定文件名或口罩。容易。

我现与普通的表达,懒惰和反对将安装,所以我创造了一批文件,其创建的目录副本和香草DOS命令。似乎艰苦的但是快为我比作出来的.

  1. 创建你的源文件列表与完整的路径,包括驱动信如果nec,在文本的文件。
  2. 关于经常表达在你的文本编辑器。
  3. 添加双轮报价的每一行情况的空间搜索字符串 (.*) 替字符串 "\1", 和替换所有的点击
  4. 创建两条线路每个文件-一个创建的目录中,一个复制的文件(异将被替换为目的地的路径)-搜索字符串 (.*) 替字符串 md qqq\1\nxcopy \1 qqq\1\n 和替换所有的点击
  5. 删除的文件,从目的地的路径搜索 \\([^\\^"]+)"\n 替换 \\"\n
  6. 更换的目的地的路径(在这个例子 A:\srcB:\dest).关闭的经常表现、搜索 qqq"A:\src\ 替换 B:\dest\ 并且点击替换。

md将创建嵌套的目录。复制可能会具有相同行为来xcopy在这个例子。你可能需要添加/Y xcopy抑制复盖证实。你结束了一批文件,像这样:

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

重复的每一个文件在你原来的名单。测试windows7资.

要使用拖放做到这一点,使用拖放的WinZip有一个目录结构保存选项。只需创建在目录级一个新的.zip这将是你的根并拖动文件。

要所有文本文件复制到G:和保存目录结构:

xcopy *.txt /s G:
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top