디렉터리 구조를 복사하지만 특정 파일 만 포함하는 방법 (Windows 배치 파일 사용)


103

제목에서 알 수 있듯이 디렉토리 구조를 재귀 적으로 복사하지만 일부 파일 만 포함하려면 어떻게해야합니까? 예를 들어 다음과 같은 디렉토리 구조가 있습니다.

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

답변:


169

배치 전용이어야하는지 언급하지 않지만을 사용할 수 있으면 다음을 ROBOCOPY시도하십시오.

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

편집 : 빈 폴더를 포함 하도록 /S매개 변수를 변경했습니다 /E.


이 구문으로 * .zip을 복사 할 수 있습니까? 나는 data.zip 대신 * .zip을 작성하려고 시도했지만 파일을 복사하지 않고 폴더 만 복사했습니다. ? 나는 또한 시도 .ZIP
닐스 Brinch에게

@Niels Brinch 예, 그렇게 할 수 있어야합니다. 사용중인 정확한 명령 줄은 무엇입니까?
aphoria

1
ROBOCOPY C : \ 소스 C : \ 대상 * .ZIP / E
닐스 Brinch

기묘한. 어떤 OS를 사용하고 있습니까? 필요한 파일 / 폴더 권한이 있습니까? 방금 Win 7에서 테스트하고 *.zip나를 위해 일했습니다.
aphoria

정말!? 나는 또한 Win 7을 사용하고있다. 내가 시도 할 때 어떤 파일도 복사하지 않는다. 폴더 만. 다시 해보겠습니다. .하자 * .ZIP 및 * .JPG 말한다 - 우리가 그것에있어 (구문이 * .ZIP이보다 더 포함하는 것입니다
닐스 Brinch

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!"
    )
)

외부 for 문은의 하위 디렉토리 SOURCE_DIR와의 이름 의 가능한 경로 조합을 생성합니다 FILENAMES_TO_COPY. 기존 파일 각각에 대해 xcopy가 호출됩니다. 에서 만들어야 FILE_INTERMEDIATE_DIR하는 파일의 하위 디렉터리 경로를 SOURCE_DIR포함합니다 DEST_DIR.


1
폴더와 하위 폴더에서 모든 사진을 복사해야했는데이 배치 스크립트가 도움이되었습니다. set FILENAMES_TO_COPY=data.zip info.txt위 의 줄을 변경했습니다set FILENAMES_TO_COPY=*.jpg
Kai Noack

파일 경로에 공백이 있기 때문에 오류가 발생합니다 (SOURCE_DIR = "C : \ Origin Test", DEST_DIR = "C : \ Dest Test", 오류 : Test ""는 현재 예상치 못한 오류였습니다). % var %를! var로 변경하려고했습니다! 모든 곳에서 성공하지 못했습니다. 이 문제를 해결하는 방법에 대한 단서가 있습니까? 전체 구조는 공백이있는 폴더 이름으로 가득 차 있습니다.
ricardo.scholz

1
시도 set "SOURCE_DIR=C:\Origin Test"하고 set "DEST_DIR=C:\Dest Test". 큰 따옴표의 위치에 유의하십시오.
sakra

13

find 출력 (즉, 파일 경로)을 cpio로 파이핑 해보십시오.

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

cpio는 대상 파일의 타임 스탬프를 확인하므로 안전하고 빠릅니다.

일단 익숙해지면 더 빠른 작업을 위해 -v를 제거하십시오.


2
@Christian 표준 설치의 일부가 아닌 cpio에 대한 종속성이 있습니다.
Crashworks

8

Powershell이 ​​옵션 인 경우 다음을 수행 할 수 있습니다.

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

가장 큰 단점은 지정한 필터와 일치하는 파일이 없기 때문에 비어있는 경우에도 모든 폴더를 복사한다는 것입니다. 따라서 원하는 파일이있는 몇 개의 폴더 외에도 빈 폴더로 가득 찬 트리를 만들 수 있습니다.


두 번째로 실행하면 목적지가 변경됩니다. (파일을 하위 폴더에 넣습니다.) 저에게 묻는 것은 어리석은 행동입니다. rm -r -ErrorAction:SilentlyContinue d:\destinationPath이를 수정하기 위해 복사하기 전에 실행 하는 것이 좋습니다.
MakotoE

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

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

모든 개선을 환영합니다. :)


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

4

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

4

모든 텍스트 파일을 G :에 복사하고 디렉토리 구조를 유지하려면 :

xcopy *.txt /s G:

하위 폴더에서 모든 .txt를 복사하고 기본 디렉토리에 상대적인 디렉토리 구조를 유지하는 것과 같이 반복적으로 작동 할 수 있습니까?
Micka

3

두 가지 간단한 명령 일 뿐이지 만 복사 할 필요가없는 파일이 작지 않는 한 권장하지 않습니다. 이는 모든 파일을 복사 한 다음 복사본에 필요하지 않은 파일을 제거하기 때문입니다.

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에는이를위한 충분한 명령이 있음).


감사합니다. 앞서 언급했듯이 복사해야하는 파일은 일반적으로 작지만 복사해서는 안되는 파일이 더 크기 때문에 (그리고 그 수가 많을 수 있습니다) 이상적이지 않습니다.
M4N

2

Linux 및 기타 UNIX 시스템에서 tar명령을 사용하면 이 작업을 쉽게 수행 할 수 있습니다.

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

그런 다음 대상으로 이동하고 다음을 수행합니다.

$ tar xvf /tmp/full-structure.tar 

물론 첫 번째 tar의 출력을 두 번째로 파이프 할 수 있지만 단계별로 작동하는 것을 보는 것이 이해하고 설명하기가 더 쉽습니다. 다음 명령에서 필요한 cd / to / new / path /가 누락되었습니다. 지금 수행하는 방법이 기억 나지 않습니다. 다른 사람이 추가 할 수 있습니다.

$ tar cvf -  *data.zip *info.txt |  tar xvf - 

Tar (gnutar)는 Windows에서도 사용할 수 있지만 xcopy해당 플랫폼에서 직접 방법을 사용할 것입니다 .


tar cvf /tmp/full-structure.tar ** / data.zip ** / info.txt가 나를 위해 일했습니다
ssinganamalla

"tar cvf /tmp/full-structure.tar ** / data.zip ** / info.txt"및 "tar cvf /tmp/full-structure.tar * data.zip * info.txt"모두 3 개의 오류가 발생했습니다. : (1) "tar : * data.zip : Cannot stat : No such file or directory", (2) "tar * info.txt : Cannot stat : No such file or directory", (3) "tar : 종료 이전 오류로 인한 실패 상태 ". 어떤 폴더에서이 모든 작업을 수행합니까? 나는이 방법을 이해하지 못한다.
user1271772

문제는 WINDOWS 말한다
Anfelipe

Win10에는 WSL이 있으므로 유효합니다. tar는 Windows에서 20 년 이상 사용 가능했으며 파이프 사용은 MS-DOS 시절부터 작동했습니다. 모든 쉘 환경에서 PWD는 중요합니다. PWD-현재 작업 디렉토리. 나는이 솔루션이 최종 사용자에게는 적고 파워 유저 나 프로그래머에게는 더 많은 것을 인정할 것입니다.
JohnP

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

편집 : 빈 폴더를 보존하려면 (게시물을 다시 읽을 때) / S 대신 / E를 사용하십시오.


1
폴더 구조를 유지하지 않습니다.
Paulius

/ E 옵션은 필요한 경우 빈 폴더 만들기를 포함하여 폴더 구조를 유지합니다. 파일 이름은 와일드 카드 (예 : folder1 \ *. zip) 와도 작동합니다. 존재하지 않는 전체 파일 이름을 전달할 때 "파일을 찾을 수 없음 오류"만 표시됩니다 (이 경우 "파일을 찾을 수 없음-xxx.xxx 0 개의 파일이 복사 됨"이 표시됩니다. 패턴을 지정하면 파일을 반환하지 않는 경우 (예 : folder1 \ *. zzz), "0 개의 파일 (* s) 복사 됨"만 표시됩니다.
gkrogers

1

WinRAR 명령 줄 인터페이스를 사용하여 파일 이름 및 / 또는 파일 유형을 아카이브에 복사 할 수 있습니다. 그런 다음 원하는 위치에 해당 아카이브를 추출 할 수 있습니다. 이렇게하면 원래 파일 구조가 유지됩니다.

음악 자체를 다시 복사하지 않고도 휴대폰에 누락 된 앨범 사진 파일을 추가해야했습니다. 다행히 디렉토리 구조는 내 컴퓨터와 모바일에서 동일했습니다!

나는 사용했다 :

   rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
  • C : \ Downloads \ music.rar = 생성 할 아카이브
  • X : \ music \ = 음악 파일이 들어있는 폴더
  • Folder.jpg = 복사하고 싶은 파일명

이렇게하면 적절한 하위 디렉터리에 모든 Folder.jpg 파일이있는 아카이브가 생성되었습니다.

이 기술은 파일 형식 복사에도 사용할 수 있습니다. 파일 이름이 모두 다른 경우 모든 파일을 단일 디렉토리로 추출하도록 선택할 수 있습니다. 추가 명령 줄 매개 변수는 여러 파일 유형을 보관할 수 있습니다.

이 매우 유용한 링크 http://cects.com/using-the-winrar-command-line-tools-in-windows/에 대한 자세한 정보


1

사용하는 사람들을 위해 Altap 도롱뇽 (2 개 패널의 파일 관리자) : 복사 팝업의 옵션에서 바로 파일 이름이나 마스크를 지정합니다. 쉬운.


0

나는 정규 표현식을 잘 사용하고 설치를 싫어하기 때문에 디렉토리를 생성하고 바닐라 DOS 명령으로 복사하는 배치 파일을 만들었다. 로보 카피를하는 것보다 힘들지만 더 빠릅니다.

  1. 텍스트 파일에 드라이브 문자 (필요한 경우)를 포함하여 전체 경로가있는 소스 파일 목록을 만듭니다.
  2. 텍스트 편집기에서 정규식을 켭니다.
  3. 공백의 경우 각 줄에 큰 따옴표 추가-검색 문자열 (.*)대체 문자열"\1" 하고 모두 대체를 클릭하십시오.
  4. 검색 문자열 - (QQQ는 대상 경로로 대체됩니다) 파일을 복사, 하나를 디렉토리를 생성 한 - 파일 당 두 줄을 만들고 (.*)문자열을 대체 md qqq\1\nxcopy \1 qqq\1\n하고 모두 바꾸기를 클릭
  5. 대상 경로에서 파일 이름 제거 – 검색 \\([^\\^"]+)"\n바꾸기\\"\n
  6. 대상 경로 (이 예에서는 A:\srcB:\dest)를 바꿉니다 . 정규식을 끄고 qqq"A:\src\바꾸기를 검색 한 다음 모두 바꾸기 B:\dest\를 클릭합니다.

md는 중첩 된 디렉토리를 생성합니다. copy는이 예제에서 xcopy와 동일하게 동작 할 것입니다. 덮어 쓰기 확인을 억제하기 위해 xcopy에 / Y를 추가 할 수 있습니다. 다음과 같은 배치 파일로 끝납니다.

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

원래 목록의 모든 파일에 대해 반복됩니다. Win7에서 테스트되었습니다.


-1

드래그 앤 드롭을 사용하여 winzip을 사용하려면 dir 구조 보존 옵션이 있습니다. 루트가 될 디렉터리 수준에서 새 .zip을 만들고 파일을 끌어다 놓습니다.


감사합니다.하지만 스크립트 (배치) 파일에서 사용할 솔루션을 찾고있었습니다. 따라서 드래그 앤 드롭이 필요 없습니다 ...
M4N 2011-09-10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.