sourcecode

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

codebag 2023. 6. 2. 20:27
반응형

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

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

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 변수 to 한대 변수 개매 에▁to./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(즉, find)의 파이프 출력을 시도합니다.파일 경로)를 cpio로 변환

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

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

익숙해지면 -v를 제거하여 작업 속도를 높입니다.

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

xcopy *.txt /s G:

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" 변수를 사용할 수 있습니다.또한 지정된 유형의 파일 또는 선택적 파일 이름만 복사할 수 있습니다.

어떠한 개선도 환영합니다.:)

찾기 및 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+ BATCH에는 이를 위한 명령이 충분합니다).

및 사용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할 수 아마도 Tar(gnutar)는 Windows에서 입니다.xcopy그 플랫폼에서 나 자신을 방법.

Altap Salamander(2 패널 파일 관리자)를 사용하는 경우: 복사 팝업의 옵션에서 파일 이름 또는 마스크를 지정하면 됩니다.만만하다.

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 = 복사하고 싶은 파일 이름

이렇게 하면 적절한 하위 디렉터리에 모든 Folder.jpg 파일이 있는 보관 파일이 만들어집니다.

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

이 매우 유용한 링크에 더 많은 정보가 있습니다. http://cects.com/using-the-winrar-command-line-tools-in-windows/

저는 정규 표현식이 좋고, 게으르고 설치를 싫어하기 때문에 바닐라 DOS 명령으로 디렉터리와 복사본을 만드는 배치 파일을 만들었습니다.힘들 것 같지만 로봇 복사를 하는 것보다 더 빠릅니다.

  1. 텍스트 파일에 드라이브 문자(필요한 경우)를 포함하여 전체 경로가 있는 원본 파일 목록을 만듭니다.
  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는 중첩된 디렉토리를 생성합니다.이 예에서 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"

원래 목록의 모든 파일에 대해 반복됩니다.Windows 7에서 테스트됨.

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

언급URL : https://stackoverflow.com/questions/472692/how-to-copy-a-directory-structure-but-only-include-certain-files-using-windows

반응형