답변:
단일 파일의 경우 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
또한 표준 출력으로 출력, 그래서 당신이 수행 할 수 있습니다 것입니다 tee outputfile1 outputfile2 < inputfile > /dev/null
설정을 가지는 잡음이 엉망이 될 수있는 단자에 이진 파일을 출력하기 때문이다.
tar cf - file1 file2 | tee >(tar xf - -C ouput1) | tar xf - -C output2
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의 기사.
비슷한 질문에 대한 답변을 바탕으로 또 다른 방법은 GNU Parallel 을 사용 cp
하여 한 번에 여러 인스턴스 를 실행하는 것입니다 .
parallel -j 0 -N 1 cp file1 ::: Destination1 Destination2 Destination3
위의 명령은 file1을 세 대상 폴더 모두에 병렬로 복사합니다
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.
이 답변에 따르면 /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
tar
은 파일 속성 (예 : 수정 날짜 / 시간, (보호) 모드 및 잠재적으로 ACL, 소유자 / 그룹 (권한이있는 경우), SELinux를 자동으로 복사 (보존)한다는 것입니다. 컨텍스트 (해당되는 경우), 확장 속성 (해당되는 경우) 등) ... ... ... ... ... ... PS 왜 것 사용에 대한 사용자의 필요 bash -x
?
#!/bin/sh
스크립트 시작 부분에 사용 했지만 명령 구문이 허용되지 않습니다. 당신은 사용할 수 있습니다 bash -x
또는 #!/bin/bash
파일의 시작 부분에. 왜 해석 sh
과 bash
해석에 차이가 있는지 모르겠습니다 .
bash에서 :
for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;