How to copy a directory structure but only include certain files (using windows batch files)

前端 未结 15 1680
半阙折子戏
半阙折子戏 2020-12-07 07:50

As the title says, how can I recursively copy a directory structure but only include some files. E.g given the following directory structure:

folder1
  folde         


        
相关标签:
15条回答
  • 2020-12-07 08:07

    An alternate solution that copies one file at a time and does not require 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!"
        )
    )
    

    The outer for statement generates any possible path combination of subdirectory in SOURCE_DIR and name in FILENAMES_TO_COPY. For each existing file xcopy is invoked. FILE_INTERMEDIATE_DIR holds the file's subdirectory path within SOURCE_DIR which needs to be created in DEST_DIR.

    0 讨论(0)
  • 2020-12-07 08:07

    To copy all text files to G: and preserve directory structure:

    xcopy *.txt /s G:
    
    0 讨论(0)
  • 2020-12-07 08:08

    You don't mention if it has to be batch only, but if you can use ROBOCOPY, try this:

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

    EDIT: Changed the /S parameter to /E to include empty folders.

    0 讨论(0)
  • 2020-12-07 08:08

    If Powershell is an option, you can do this:

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

    The main disadvantage is it copies all folders, even if they will end up being empty because no files match the filter you specify. So you could end up with a tree full of empty folders, in addition to the few folders that have the files you want.

    0 讨论(0)
  • 2020-12-07 08:09

    Thanks To Previous Answers. :)

    This script named "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
    

    It accepts variable of "Source", "Destination", and "FileName". It also can only copying specified type of files or selective filenames.

    Any improvement are welcome. :)

    0 讨论(0)
  • 2020-12-07 08:16

    That's only two simple commands, but I wouldn't recommend this, unless the files that you DON'T need to copy are small. That's because this will copy ALL files and then remove the files that are not needed in the copy.

    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"
    

    Sure, the second command is kind of long, but it works!

    Also, this approach doesn't require you to download and install any third party tools (Windows 2000+ BATCH has enough commands for this).

    0 讨论(0)
提交回复
热议问题