에 복사하는 방법은 디렉토리 구조 만 포함 특정 파일(사용하여 windows 배치 파일)
-
19-08-2019 - |
문제
제목으로 말할 수 있는 방법을 재귀적으로 복사 디렉토리 구조 하지만 일부를 포함한 파일이 있습니다.예를 들어 다음과 같은 디렉토리 구조로 구성되어 있다:
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!"
)
)
명령문의 외부는 서브 디렉토리의 가능한 경로 조합을 생성합니다. 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를 운동하는 것보다 힘들지만 더 빠릅니다.
- 텍스트 파일에서 NEC 인 경우 드라이브 문자를 포함하여 완전한 경로가있는 소스 파일 목록을 만듭니다.
- 텍스트 편집기에서 정규 표현식을 켜십시오.
- 공백의 경우 각 줄에 이중 인용문 추가 - 검색 문자열
(.*)
문자열을 교체하십시오"\1"
, 모든 교체를 클릭하십시오 - 파일 당 두 줄 만들기 - 하나는 디렉토리를 만들려면 하나가 파일을 복사 할 것입니다 (QQQ는 대상 경로로 대체됩니다) - 검색 문자열
(.*)
문자열을 교체하십시오md qqq\1\nxcopy \1 qqq\1\n
그리고 모두 교체를 클릭하십시오 - 대상 경로에서 파일 이름을 제거합니다 - 검색
\\([^\\^"]+)"\n
바꾸다\\"\n
- 대상 경로에서 교체하십시오 (이 예에서
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: