[windows] 디렉터리 구조를 복사하지만 특정 파일 만 포함하는 방법 (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



답변

배치 전용이어야하는지 언급하지 않지만을 사용할 수 있으면 다음을 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.


답변

find 출력 (즉, 파일 경로)을 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

“Source”, “Destination”및 “FileName”의 변수를 허용합니다. 또한 지정된 유형의 파일 또는 선택적 파일 이름 만 복사 할 수 있습니다.

모든 개선을 환영합니다. 🙂


답변

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


답변

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