에 복사하는 방법은 디렉토리 구조 만 포함 특정 파일(사용하여 windows 배치 파일)

StackOverflow https://stackoverflow.com/questions/472692

문제

제목으로 말할 수 있는 방법을 재귀적으로 복사 디렉토리 구조 하지만 일부를 포함한 파일이 있습니다.예를 들어 다음과 같은 디렉토리 구조로 구성되어 있다:

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

명령문의 외부는 서브 디렉토리의 가능한 경로 조합을 생성합니다. SOURCE_DIR 그리고 이름을 지정합니다 FILENAMES_TO_COPY. 각각의 기존 파일에 대해 xcopy가 호출됩니다. FILE_INTERMEDIATE_DIR 파일의 하위 디렉토리 경로를 내부에 보유합니다 SOURCE_DIR 만들어야합니다 DEST_DIR.

CPIO로 FIND (예 : 파일 경로)의 배관 출력을 시도해보십시오.

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

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

더 빠른 OP를 위해 -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

"소스", "대상"및 "Filename"의 변수를 허용합니다. 또한 지정된 유형의 파일 또는 선택적 파일 이름 만 복사 할 수도 있습니다.

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

찾기 및 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

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

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+ 배치에는 충분한 명령이 있습니다).

Linux 및 기타 유닉스 시스템에서 tar 명령은 이것을 쉽게 수행 할 것입니다.

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

그런 다음 대상으로 CWD를 받고 :

$ tar xvf /tmp/full-structure.tar 

물론 첫 번째 타르에서 출력을 두 번째로 파이프 할 수는 있지만 단계적으로 작동하는 것을 보는 것은 이해하고 설명하기가 더 쉽습니다. 다음 명령에 필요한 CD/TO/New/Path/가 누락되었습니다. 지금은 방법을 기억하지 못합니다. 다른 사람이 그것을 추가 할 수 있습니다.

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

Tar (Gnutar)는 창에서도 사용할 수 있지만 아마도 xcopy 해당 플랫폼에서 스스로 방법.

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

편집하다: 빈 폴더를 보존하려면 (게시물을 다시 읽을 때) /s 대신 /e를 사용하는 것 같습니다.

Winrar 명령 줄 인터페이스를 사용하면 파일 이름 및/또는 파일 유형을 아카이브에 복사 할 수 있습니다. 그런 다음 원하는 위치에 해당 아카이브를 추출 할 수 있습니다. 이것은 원본 파일 구조를 보존합니다.

음악 자체를 재시성 할 필요없이 누락 된 앨범 사진 파일을 휴대폰에 추가해야했습니다. 다행스럽게도 디렉토리 구조는 내 컴퓨터와 모바일에서 동일했습니다!

나는 사용했다 :

   rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
  • C : downloads music.rar = 생성 할 아카이브
  • x : music = 음악 파일이 포함 된 폴더
  • folder.jpg = 파일 이름을 복사하고 싶었습니다

이로 인해 적절한 하위 디렉토리의 모든 폴더.jpg 파일이 포함 된 아카이브가 생성되었습니다.

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

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

사용하는 사람들을 위해 Altap Salamander (2 패널 파일 관리자) : 사본 팝업 옵션에서 파일 이름 또는 마스크를 지정하십시오. 쉬운.

나는 정규 표현식, 게으르고 설치에 대한 혐오로 괜찮으므로 디렉토리와 바닐라 DOS 명령으로 사본을 작성하는 배치 파일을 만들었습니다. Robocopy를 운동하는 것보다 힘들지만 더 빠릅니다.

  1. 텍스트 파일에서 NEC 인 경우 드라이브 문자를 포함하여 완전한 경로가있는 소스 파일 목록을 만듭니다.
  2. 텍스트 편집기에서 정규 표현식을 켜십시오.
  3. 공백의 경우 각 줄에 이중 인용문 추가 - 검색 문자열 (.*) 문자열을 교체하십시오 "\1", 모든 교체를 클릭하십시오
  4. 파일 당 두 줄 만들기 - 하나는 디렉토리를 만들려면 하나가 파일을 복사 할 것입니다 (QQQ는 대상 경로로 대체됩니다) - 검색 문자열 (.*) 문자열을 교체하십시오 md qqq\1\nxcopy \1 qqq\1\n 그리고 모두 교체를 클릭하십시오
  5. 대상 경로에서 파일 이름을 제거합니다 - 검색 \\([^\\^"]+)"\n 바꾸다 \\"\n
  6. 대상 경로에서 교체하십시오 (이 예에서 A:\src 그리고 B:\dest). 정규 표현식을 끄고 검색하십시오 qqq"A:\src\ 바꾸다 B:\dest\ 그리고 모두 교체를 클릭하십시오.

MD는 중첩 디렉토리를 생성합니다. 이 예에서는 사본이 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에서 테스트.

드래그 앤 드롭 으로이 작업을 수행하려면 Winzip 사용 DIR 구조 보존 옵션이 있습니다. 루트 및 드래그 파일 인 디렉토리 레벨에서 새 .zip을 작성하기 만하면됩니다.

모든 텍스트 파일을 G로 복사하고 디렉토리 구조를 보존하려면 :

xcopy *.txt /s G:
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top