cpio를 사용하여 디렉토리를 재귀적으로 복사하는 방법은 무엇입니까?

cpio를 사용하여 디렉토리를 재귀적으로 복사하는 방법은 무엇입니까?

목록의 디렉토리를 재귀적으로 복사하는 방법은 무엇입니까 my-files-to-copy.txt?

cd my/source/dir
cpio --create < my-files-to-copy.txt | (cd my/dest/dir && cpio --extract)
복사하고 싶은 파일.txt
src/main.js
src/routes/index.js
src/my-app/ # a directory with it's own child tree I want to recursively copy

답변1

cpio목록 파일을 "전처리"하는 방법으로 디렉터리 경로 이름을 감지하고 이를 반복하여 그 아래에 있는 모든 파일의 경로 이름을 추출하는 추가 스크립트를 수행하지 않는 한 실제로 이 작업을 수행할 수 있는 방법이 없습니다 .

다음과 같은 다른 도구를 사용하는 것이 훨씬 쉽습니다( rsync나중에 추가 내용을 참고하세요!).-r--files-from

rsync -a --files-from=my-files-to-copy.txt -r my/source/dir my/dest/dir

... 또는 pax(표준 유틸리티):

( cd my/source/dir && pax -w ) <my-files-to-copy.txt |
( cd my/dest/dir   && pax -r )

...또는 pax대상 디렉터리의 절대 경로를 제공할 수 있는 경우:

( cd my/source/dir && pax -rw /my/dest/dir ) <my-files-to-copy.txt

...또는 BSD tar( GNU 사용 -T또는 --files-from=대체 ):-Itar

tar -c -f - -C my/source/dir -I my-files-to-copy.txt |
tar -x -f - -C my/dest/dir

이 모든 것은 my-files-to-copy.txt현재 디렉토리에 있다고 가정하며 해당 디렉토리는 해당 디렉토리와 다를 수 있습니다 my/source/dir.

답변2

이전 댓글에서 언급했듯이 cpio원하는 것을 지원하십시오. 예를 들면 다음과 같습니다.

find src/main.js src/routes/index.js src/my-app/ | cpio -pdm my/dest/dir

이 접근 방식의 단점은 속도를 높이지 않는 방식으로 두 개의 프로세스를 실행해야 한다는 것입니다. 모든 파일이 find필요 하고 잠시 후에 모든 파일도 필요하며 실제 작업을 수행하는 데 하나의 프로세스만 사용되기 때문입니다. 사자.stat(2)cpiostat(2)cpio

...또는 내 도구를 사용하여 가장 효율적인 방법으로 수행할 수 있습니다 star(가장 오래된 무료 tar 구현).

star -copy -p -find src/main.js src/routes/index.js src/my-app/ my/dest/dir

star이는 프로세스 내에서 사용될 때 파일당 한 번만 호출하면 되며 파일을 읽는 기본 프로세스와 동시에 새 파일을 생성하는 두 번째 프로세스를 생성하기 때문에 효율적입니다 .libfindstarstat(2)star

이 방법의 속도 저하를 피하기 위해 두 star프로세스는 공유 메모리를 통해 파일 내용과 파일 메타데이터를 공유합니다.

참고: 물론 내 예제의 파일 목록을 다음으로 바꿀 수 있습니다.

` cat my-file-list.txt ` 

관련 정보