제목에서 알 수 있듯이 디렉토리 구조를 재귀 적으로 복사하지만 일부 파일 만 포함하려면 어떻게해야합니까? 예를 들어 다음과 같은 디렉토리 구조가 있습니다.
folder1
folder2
folder3
data.zip
info.txt
abc.xyz
folder4
folder5
data.zip
somefile.exe
someotherfile.dll
data.zip 및 info.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