2009-01-23 115 views
75

如标题所示,我如何递归复制一个目录结构,但只包含一些文件。 E.g给出下面的目录结构:如何复制一个目录结构,但只包含某些文件(使用windows批处理文件)

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 

回答

124

你不提,如果它仅是批量的,但如果你能使用ROBOCOPY,试试这个:

ROBOCOPY C:\Source C:\Destination data.zip info.txt /E 

编辑:将/S参数更改为/E以包括空文件夹。

+0

能否复制* .zip文件与此语法?我试着写* .zip而不是data.zip,但它没有复制文件,只复制文件夹。我也试过了?.zip – 2012-09-19 21:47:09

+0

@Niels Brinch是的,你应该可以做到这一点。你使用的是什么确切的命令行? – aphoria 2012-09-19 23:53:20

+1

ROBOCOPY C:\ Source C:\ Destination * .zip/E – 2012-09-20 07:28:02

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

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

3

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

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有足够的命令用于此目的)。此文来自人人IT网,请访问www.renren.it获取更多内容

4

到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 
24

,在一次拷贝一个文件,不需要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_DIR中的子目录和FILENAMES_TO_COPY中的名称的任何可能的路径组合。对于每个现有的文件xcopy被调用。 FILE_INTERMEDIATE_DIRSOURCE_DIR中保存文件的子目录路径,该路径需要在DEST_DIR中创建。

-1

要做到这一点与拖放使用winzip有一个目录结构保留选项。只需在目录级别创建一个新的.zip文件,这将成为您的根目录并将文件拖入。

7

感谢以前的答案。 :)

这个脚本命名为 “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 

它接受 “源”, “目标” 和 “文件名” 的变量。 它也只能复制指定类型的文件或选择性文件名。

任何改进都是值得欢迎的。 :)

12

发现(即文件路径)的尝试管道输出到的cpio

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

的cpio检查目标文件的时间戳 - 因此它的安全和快捷。

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

2

在Linux和其他UNIX系统下,使用tar命令可以轻松完成此操作。

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

然后,你CWD的目标和:

$ tar xvf /tmp/full-structure.tar 

当然你可以管,从第一到焦油第二输出,但看到它在步骤的工作更容易理解和说明。我在下面的命令中缺少必要的cd/to/new/path/- 我现在不记得该怎么做。有人可以添加它,希望。

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

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

4

由于只找和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 ";" 
1

对于使用Altap Salamander(2个面板文件管理器)的:在复制弹出的选项,只要指定文件名或口罩。简单。

0

我很好用正则表达式,懒惰和厌恶安装,所以我创建了一个批处理文件,创建目录和副本与香草DOS命令。对于我来说,看起来很费劲但比解决robocopy更快。

  1. 在文本文件中创建包含完整路径(包括驱动器号如果有的话)的源文件列表。
  2. 在文本编辑器中打开正则表达式。
  3. 添加双引号一轮每一行的空间的情况下 - 搜索字符串(.*)替换字符串"\1",然后单击全部替换
  4. 创建每个文件的两行 - 一个创建目录,一个复制的文件(QQQ将被替换与目标路径) - 搜索字符串替换(.*)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" 

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

4

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

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

主要缺点是它会将所有的文件夹,即使他们最终会是空的,因为没有文件匹配您指定的过滤。因此,除了少数具有所需文件的文件夹之外,您最终还是可以得到一个充满空文件夹的树。

1

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

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

我用:含音乐文件\音乐\ =文件夹

  • Folder.jpg =文件名:

    rar a -r C:\Downloads\music.rar X:\music\Folder.jpg 
    
    • C:\下载\ music.rar =存档要创建
    • X我想复制

    这创建了一个包含正确子目录中所有Folder.jpg文件的存档。

    此技术也可用于复制文件类型。如果这些文件的名称都不相同,则可以选择将所有文件提取到单个目录。其他命令行参数可以归档多个文件类型。在这个非常有用的链接http://cects.com/using-the-winrar-command-line-tools-in-windows/

  • -1

    更多信息复制所有文本文件G:和保存的目录结构:

    xcopy *.txt /s G: 
    
    相关问题