Windows에서 전체 상대 경로로 파일 복사

Windows에서 전체 상대 경로로 파일 복사

꽤 복잡한 폴더 구조에 많은 파일 세트(45,000개 이상)가 있습니다. 원본 폴더 경로로 복사하려는 ~13,000개 파일의 하위 집합과 해당 경로(루트 폴더 기준)를 추출했습니다.

철저하게 검색했지만 xcopy나 robocopy를 사용하여 원하는 작업을 수행할 수 있는 방법을 찾을 수 없었습니다. 목록의 각 항목에 대해 하나의 복사 명령을 사용하여 배치 파일을 쉽게 만들 수 있었습니다. 그러나 내 소스 파일에서 대상의 폴더 경로를 생성하는 x/robocopy 스위치 또는 스위치 조합을 찾을 수 없습니다. 예:

xcopy dir1\dir2\dir3\file.txt copy_folder /<some switches>

또는

xcopy dir1\dir2\dir3\file.txt copy_folder\dir1\dir2\dir3\file.txt /<some switches>

dir1\dir2\dir3폴더 아래에 경로가 없으면 경로를 만들고 거기 copy_folder에 복사본을 저장하고 싶습니다 file.txt. 나는 Linux에서 cp --parent정확히 그렇게 한다는 것을 이해합니다.

이를 달성하는 가장 좋은 방법에 대한 제안은 무엇이든 환영합니다!

답변1

XCOPY는 폴더가 없으면 폴더를 생성하지만 먼저 대상이 파일인지 디렉터리인지 묻는 메시지를 표시합니다.

따라서 명령이 일시 중지되지 않도록 F 응답을 XCOPY 명령으로 파이프할 수 있습니다.

for /f "delims=" %%F in (yourList.txt) do echo f 2>nul | xcopy /y "%%~F" "copyFolder\%%~F"

/Y옵션은 목록에 중복된 항목이 있는 경우에 사용됩니다. XCOPY 명령이 덮어쓸지 묻는 메시지를 표시하는 것을 원하지 않습니다.

경로가 존재하는 경우 stderr를 nul로 리디렉션해야 하며, 이 경우 오른쪽이 왼쪽보다 먼저 완료되어 왼쪽이 stderr에 다음 오류 메시지를 인쇄하게 됩니다. The process tried to write to a nonexistent pipe.리디렉션은 원치 않는 오류 메시지를 숨깁니다.

또 다른 옵션은 XCOPY를 수행하기 전에 먼저 대상 경로를 만드는 것입니다. 경로가 이미 존재하는 경우 오류 메시지가 표시되지 않도록 하려면 stderr를 null로 리디렉션하기만 하면 됩니다.

for /f "delims=" %%F in (yourList.txt) do (
  md "copyFolder%%~pF" 2>nul
  xcopy /y "%%~F" "copyFolder\%%~F"
)

두 가지 해결 방법 모두 목록의 경로에 드라이브 문자가 포함되어 있으면
"copyFolder%%~pnxF"대신 을 사용해야 합니다 "copyFolder\%%~F". 수정자 에는 ~p선행 \.

관련 정보