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

M4N*_*M4N 94 windows cmd batch-file robocopy

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

folder1
  folder2
    folder3
      data.zip
      info.txt
      abc.xyz
    folder4
    folder5
      data.zip
      somefile.exe
      someotherfile.dll
Run Code Online (Sandbox Code Playgroud)

文件data.zipinfo.txt可以出现在目录结构的任何地方.如何复制完整的目录结构,但只包含名为data.zip和info.txt的文件(应忽略​​所有其他文件)?

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

copy_of_folder1
  folder2
    folder3
      data.zip
      info.txt
    folder4
    folder5
      data.zip
Run Code Online (Sandbox Code Playgroud)

aph*_*ria 159

你没有提到它是否必须只是批量,但如果你可以使用ROBOCOPY,试试这个:

ROBOCOPY C:\Source C:\Destination data.zip info.txt /E
Run Code Online (Sandbox Code Playgroud)

编辑:将/S参数更改/E为包含空文件夹.


sak*_*kra 29

另一种解决方案,一次复制一个文件,不需要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!"
    )
)
Run Code Online (Sandbox Code Playgroud)

outer for语句生成子目录in SOURCE_DIR和name in的任何可能的路径组合FILENAMES_TO_COPY.对于每个现有文件,都会调用xcopy.FILE_INTERMEDIATE_DIR保存文件的子目录路径,在SOURCE_DIR该路径中需要创建DEST_DIR.


Gab*_*bow 13

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

find . -type f -name '*.jpg' | cpio -p -d -v targetdir/
Run Code Online (Sandbox Code Playgroud)

cpio检查目标文件的时间戳 - 所以它安全快速.

一旦你习惯了,就删除-v以获得更快的操作.

  • @Christian它依赖于cpio,这不是标准安装的一部分. (2认同)

小智 9

将所有文本文件复制到 G: 并保留目录结构:

xcopy *.txt /s G:
Run Code Online (Sandbox Code Playgroud)

  • @Micka 是的,确实如此 (2认同)

Nei*_*eil 8

如果选择Powershell,您可以这样做:

Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse
Run Code Online (Sandbox Code Playgroud)

主要的缺点是它复制所有文件夹,即使它们最终都是空的,因为没有文件与您指定的过滤器匹配.因此,除了包含所需文件的少数文件夹之外,您最终还是会得到一个装满空文件夹的树.


Rha*_*ahr 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
Run Code Online (Sandbox Code Playgroud)

它接受"Source","Destination"和"FileName"的变量.它还只能复制指定类型的文件或选择性文件名.

欢迎任何改进.:)


Rop*_*Rop 5

仅使用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 ";"
Run Code Online (Sandbox Code Playgroud)