如何复制一个目录结构,但只包含某些文件(使用Windowsbatch file)

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

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

一次复制一个文件的备用解决scheme,不需要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名称的任何可能的path组合。 对于每个现有的文件xcopy被调用。 FILE_INTERMEDIATE_DIRFILE_INTERMEDIATE_DIR保存需要在DEST_DIR创build的文件的子目录path。

尝试find(即文件path)pipe道输出到cpio

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

cpio检查目标文件的时间戳 – 所以它的安全和快速。

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

感谢以前的答案。 🙂

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

它接受“源”,“目标”和“文件名”的variables。 它也只能复制指定types的文件或select性文件名。

任何改进,欢迎。 🙂

与Paulius的解决scheme类似,但是您不关心的文件不会被复制然后删除:

 @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+ BATCH有足够的命令)。

只有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 ";" 

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

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

主要缺点是它复制所有的文件夹,即使它们最终是空的,因为没有文件匹配你指定的filter。 所以你最终可能会得到一个充满空文件夹的树,除了有几个文件夹,你想要的文件。

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

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

然后你可以使用targer和$ tar xvf /tmp/full-structure.tar

当然,你可以将输出从第一个tarinput到第二个,但是看到它在步骤中工作更容易理解和解释。 我在以下命令中缺less必要的cd / to / new / path / – 我现在不记得该怎么做。 其他人可以添加它,希望。 $ tar cvf – * data.zip * info.txt | 焦油xvf –

Tar(gnutar)也可以在Windows上使用,但是我可能在该平台上自己使用xcopy方法。

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

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

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

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

我用了:

  rar a -r C:\Downloads\music.rar X:\music\Folder.jpg 
  • C:\ Downloads \ music.rar =要创build的档案
  • X:\ music \ =包含音乐文件的文件夹
  • Folder.jpg =我想复制的文件名

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

这种技术也可以用来复制文件types。 如果这些文件都具有不同的名称,则可以select将所有文件提取到一个目录中。 其他命令行参数可以存档多个文件types。

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

对于使用Altap Salamander(2个面板文件pipe理器)的用户:在复制popup选项中,只需指定文件名或掩码。 简单。

我很正常的expression式,懒惰和厌恶安装,所以我创build了一个batch file,创build目录和副本与香草DOS命令。 看起来费劲但比我更快地处理robocopy。

  1. 在文本文件中创build包含完整path的源文件列表(包括驱动器号)。
  2. 在文本编辑器中打开正则expression式。
  3. searchstring(.*)replacestring"\1" ,然后单击全部replace
  4. 每个文件创build两行 – 一个创build目录,一个复制文件(qqq将被replace为目标path) – searchstring(.*)replacestringmd qqq\1\nxcopy \1 qqq\1\n然后单击全部replace
  5. 从目标path删除文件名 – search\\([^\\^"]+)"\nreplace\\"\n
  6. replace目标path(在本例中为A:\srcB:\dest )。 closures正则expression式,searchqqq"A:\src\ replace B:\dest\并单击replace全部。

MD将创build嵌套的目录。 在这个例子中,拷贝的行为可能与xcopy相同。 您可能想要将/ Y添加到xcopy以禁止覆盖确认。 你最终得到一个像这样的batch file:

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

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

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