단일 소스에서 여러 대상으로의 병렬 파일 복사?


15

여러 대상에 복사하려는 광 미디어에 여러 개의 큰 파일이 있습니다.이 경우 동일한 컴퓨터에 두 개의 하드 드라이브가 연결되어 있습니다. 다음과 같은 기능을 수행 할 수있는 유틸리티가 있습니까?

copy source target1 target2 ... targetN

답변:


23

단일 파일의 경우 tee여러 위치로 복사하는 데 사용할 수 있습니다 .

cat <inputfile> | tee <outfile1> <outfile2> > <outfile3>

또는 데모 버전을 선호하는 경우 :

tee <outfile1> <outfile2> > <outfile3> < <inputfile>

Dennis가 주석 tee출력 stdout에서 나열된 파일뿐만 아니라 지적한 것처럼, 위 예제에서 경로 재 지정을 사용하여 파일 3을 가리 킵니다. 이것을 /dev/null아래와 같이 리디렉션 할 수도 있습니다-이것은 명령 줄에서 파일 목록을보다 일관되게 유지하는 이점이 있습니다 (변수 수의 파일에 대한 솔루션을 더 쉽게 스크립팅 할 수 있음). 효율성 차이는 작습니다. cat버전을 사용하지 않거나 버전이없는 버전 과의 차이와 거의 cat같습니다.

cat <inputfile> | tee <outfile1> <outfile2> <outfile3> > /dev/null

당신은 아마와 위 중 하나를 결합 할 수있는 find파일 디렉토리 구조에 걸쳐 작동하도록 덜 쉽게 하나의 디렉토리에 여러 파일에서 작동하고 아주 쉽게. 그렇지 않으면 여러 개의 복사 작업을 별도의 작업으로 병렬로 해제하고 OS 디스크 캐시가 밝고 및 / 또는 각 병렬 작업이 드라이브 헤드를 유발하는 대신 처음부터 캐시 된 읽기 데이터를 사용하기에 충분히 크기를 바랍니다. 대패.

가용성 : tee일반적으로 GNU "coreutils"패키지의 일부로 표준 Linux 설정 및 기타 유닉스 또는 유닉스 계열 시스템에서 일반적으로 사용 가능합니다. Windows를 사용하는 경우 (질문이 지정되지 않은 경우) Cygwin과 같은 다양한 Windows 포트에서 찾을 수 있습니다.

진행 정보 : 큰 파일을 광 미디어에서 복사하는 데 시간이 오래 걸리거나 (네트워크 속도가 느리거나 로컬 고속 미디어의 파일보다 큰 경우) 진행 정보가 유용 할 수 있습니다. 명령 행에서 내가 사용하는 경향이 파이프 뷰어 이 대한 (여기서 사용할 수 없습니다 직접 자신을 컴파일 대부분의 리눅스 배포판 및 많은 윈도우 포트 컬렉션을 쉽게 사용할 수를) - 바로 교체 cat와 함께 pv그래서 같은 :

pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>

tee.exe가 UnxUtils 패키지의 일부라는 것을 알았습니다. 좋은 팁 주셔서 감사합니다!
Goyuix

5
참고 tee또한 표준 출력으로 출력, 그래서 당신이 수행 할 수 있습니다 것입니다 tee outputfile1 outputfile2 < inputfile > /dev/null설정을 가지는 잡음이 엉망이 될 수있는 단자에 이진 파일을 출력하기 때문이다.
추후 공지가있을 때까지 일시 중지되었습니다.

디렉토리와 여러 파일의 경우 cat 대신 tar를 사용하십시오. 예를 들어tar cf - file1 file2 | tee >(tar xf - -C ouput1) | tar xf - -C output2
CR.

5

Windows의 경우 :

n2ncopy 는 다음을 수행합니다.

대체 텍스트

Linux의 경우 :

cp명령만으로는 여러 소스에서 복사 할 수 있지만 불행히도 여러 대상에서 복사 할 수 없습니다. 어떤 종류의 루프에서 여러 번 실행해야합니다. 루프를 이와 같이 사용하고 모든 디렉토리 이름을 파일에 배치 할 수 있습니다.

OLDIFS=$IFS
IFS=$'\n'

for line in $(cat file.txt):
do
   cp file $line
done

IFS=$OLDIFS

또는 xargs를 사용하십시오.

echo dir1 dir2 dir3 | xargs -n 1 cp file1

둘 다 전체 디렉토리 / 여러 파일을 복사 할 수 있습니다. 이것은 또한에서 설명 StackOverflow의 기사.


N2NCopy 링크가 끊어진 것 같습니다.
웨슬리


4

비슷한 질문에 대한 답변을 바탕으로 또 다른 방법은 GNU Parallel 을 사용 cp하여 한 번에 여러 인스턴스 를 실행하는 것입니다 .

parallel -j 0 -N 1 cp file1 ::: Destination1 Destination2 Destination3

위의 명령은 file1을 세 대상 폴더 모두에 병렬로 복사합니다


2

bash (Linux, Mac 또는 Cygwin)에서 :

cat source | tee target1 target2 >targetN

(티는 입력을 STDOUT에 복사하므로 마지막 대상에서 리디렉션을 사용하십시오).

Windows에서 Cygwin은 종종 과도하게 사용됩니다. 대신, 고양이, 티 등을 포함한 UnxUtils 프로젝트 에서 exe를 추가 할 수 있습니다.


1

Ryan Thompson의 솔루션 :

for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;

많은 의미가 있습니다. 대상 디렉토리의 쓰기 속도가 대략 동일하면 srcfile은 디스크에서 한 번만 읽습니다. 나머지 시간은 캐시에서 읽습니다.

좀 더 일반적으로 만들 것이므로 하위 디렉토리도 얻습니다.

for x in dest1 dest2 dest3; do cp -a srcdir $x &; done; wait;

dest dirs의 쓰기 속도가 매우 다른 경우 (예 : 하나는 램 디스크에 있고 다른 하나는 NFS에 있음), srcdir을 dest1에 복사하는 동안 srcdir 부분이 더 이상 디스크 캐시에 있지 않음을 알 수 있습니다 dest2.


1

이 답변에 따르면 /superuser//a/1064516/702806

더 나은 솔루션은 tar및 을 사용하는 것 tee입니다. 명령이 더 복잡하지만 tar전송에 매우 강력한 것으로 보이며 소스를 한 번만 읽어야합니다.

tar -c /source/dirA/ /source/file1 | tee >(cd /foo/destination3/; tar -x) >(cd /bar/destination2/; tar -x) >(cd /foobar/destination1/; tar -x) > /dev/null

스크립트에서 사용하려면 다음을 사용하여 스크립트를 시작해야합니다. bash -x script.sh


이상한. 나는 "이것이 의미가 있고 공감대가있다"고 생각했다. 공감. 그런 다음 링크를 확인했습니다… : D
Kamil Maciorowski

여러 파일을 한 번에 복사하는 경우 David Spillett의 대답 보다 상당히 우수합니다 . 단일 소스 파일의 경우 추가 할 수있는 유일한 장점 tar은 파일 속성 (예 : 수정 날짜 / 시간, (보호) 모드 및 잠재적으로 ACL, 소유자 / 그룹 (권한이있는 경우), SELinux를 자동으로 복사 (보존)한다는 것입니다. 컨텍스트 (해당되는 경우), 확장 속성 (해당되는 경우) 등) ... ... ... ... ... ... PS 왜 것 사용에 대한 사용자의 필요 bash -x?
Scott

#!/bin/sh스크립트 시작 부분에 사용 했지만 명령 구문이 허용되지 않습니다. 당신은 사용할 수 있습니다 bash -x또는 #!/bin/bash파일의 시작 부분에. 왜 해석 shbash해석에 차이가 있는지 모르겠습니다 .
Rémi Girard

Kamil Maciorowski-귀하의 답변이 왜지지되지 않는지 모르겠습니다. 완벽한 솔루션입니다. 나는 그것을 공유하고 싶었다.
Rémi Girard

0

bash에서 :

for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;

2
나는 이것이 잘 수행 될 것이라고 생각하지 않습니다. 이상적인 병렬 사본에서는 한 번 읽고 여러 번 쓰고 있습니다. 나는 이것이 1 : 1 읽기를 할 것이라고 생각한다 : 쓰기. 복사본이 충분히 빨리 시작되고 드라이브 캐시가 충분히 큰 경우 실제로 읽기 헤드를 찾을 필요가 없습니다.
quck quixote

0

Windows PowerShell에서이 작업을 수행하려면 -Path인수 와 달리 -Destination여러 인수를 사용하지 않으므로 기본적으로 불가능합니다 . 그러나 -Passthrough명령을 사용 하고 데이지 체인 방식으로 연결할 수 있습니다 . (그러나 그것은 재미가 없습니다.)

가장 좋은 해결책은 여기 에 표시된대로 직접 만드는 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.