답변:
아니요, cp
여러 소스를 복사 할 수 있지만 단일 대상으로 만 복사됩니다. cp
원하는 작업에 대해 대상마다 한 번씩 여러 번 호출하도록 준비해야합니다 . 당신이 말하는 것처럼, 루프 또는 다른 도구를 사용합니다.
당신이 할 수 없습니다 cp
만 그러나 당신은 결합 할 수 있습니다 cp
으로 xargs
:
echo dir1 dir2 dir3 | xargs -n 1 cp file1
복사 것인가 file1
에 dir1
, dir2
그리고 dir3
. xargs
이 cp
작업을 수행하려면 3 번 전화 xargs
하십시오. 자세한 내용은 맨 페이지 를 참조하십시오.
cp
혼자서만 이 작업을 수행 할 수 없습니다. "다른 방법을 제안하여 도움이 되려고했다고해서 해당 질문에 답변이되지 않았다는 의미는 아닙니다.
echo dir[1-3] | xargs -n 1 cp filename
.
내가 볼 수있는 한 다음을 사용할 수 있습니다.
ls | xargs -n 1 cp -i file.dat
-i
의 옵션 cp
명령 수단은 당신이 가진 현재 디렉토리에있는 파일을 덮어 쓸 것인지 묻는 메시지가됩니다 file.dat
. 완전 자동 솔루션은 아니지만 나에게 도움이되었습니다.
-i
가드를 추가하는 것이 좋지만 모든 파일을 덮어 쓰라는 메시지가 표시되지 않습니까? 디렉토리에 복사하는 대신?
cp: overwrite
질문을 인쇄 했지만 그중 하나에 대답 할 필요가 없었고 파일을 덮어 쓰지 않았습니다.
내가 사용하는 것이 cat
그리고 tee
내가에서 본 응답에 따라 /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets 대신 cp
.
예를 들면 다음과 같습니다.
cat inputfile | tee outfile1 outfile2 > /dev/null
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
Taywee의 답변에 표시된 유용한 패턴이기도합니다. cat에서 배관 할 필요가 없도록 '<'와 함께 io-redirection을 사용하십시오.
cp 자체를 사용하지는 않지만 ...
이것은 (느린) SD 카드에서 많은 Gopro 장면을 3 개의 (느린) USB 드라이브로 복사하는 맥락에서 나에게 나타났습니다. 데이터가 영원히 걸리기 때문에 한 번만 데이터를 읽고 싶었습니다. 그리고 나는 재귀를 원했습니다.
$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )
(더 많은 출력을 원하면> () 섹션을 더 추가 할 수 있습니다.)
나는 그것을 벤치마킹하지는 않았지만 cp-in-a-loop (또는 많은 병렬 cp 호출)보다 확실히 빠릅니다.
본질적으로 xargs 답변과 동일하지만 병렬 실행을 원할 경우 :
parallel -q cp file1 ::: /foo/ /bar/
예를 들어, file1을 현재 폴더의 모든 하위 디렉토리 (재귀 포함)에 복사하려면 다음을 수행하십시오.
parallel -q cp file1 ::: `find -mindepth 1 -type d`
주의 : 이것은 각각의 대상 디렉토리가 별개의 디스크 인 경우와 같이 매우 특정한 사용 사례에 대해 눈에 띄는 속도 향상만을 전달할 것입니다.
또한 xargs의 '-P'인수와 기능적으로 유사합니다.
아니 당신은 할 수 없습니다.
여러 번이 기능을 사용할 수 있다는 것을 알게 되었기 때문에이를위한 도구를 직접 만들었습니다.
http://github.com/ddavison/branch
꽤 간단합니다-
branch myfile dir1 dir2 dir3
/e
예를 들어 클라우드 웹 디렉토리를 각 시스템에 한 번만 마운트하는 방법 만 있다면 , 나만의 powertools를 작성하여 영원히 유지할 수 있습니다.
다른 방법은 다음과 같이 고양이와 티를 사용하는 것입니다.
cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>
작업이 여러 프로세스 (대상 당 하나)로 분할되고 하드 드라이브가 플래터의 다른 부분에 여러 파일을 한 번에 작성하기 때문에 이것은 매우 비효율적이라고 생각합니다. 그러나 파일을 여러 개의 다른 드라이브에 쓰려면이 방법이 효과적 일 것입니다 (모든 사본이 동시에 발생할 수 있음).
bash 스크립트 사용
DESTINATIONPATH[0]="xxx/yyy"
DESTINATIONPATH[1]="aaa/bbb"
..
DESTINATIONPATH[5]="MainLine/USER"
NumberOfDestinations=6
for (( i=0; i<NumberOfDestinations; i++))
do
cp SourcePath/fileName.ext ${DESTINATIONPATH[$i]}
done
exit
모든 대상 디렉토리가 모든 하위 디렉토리처럼 경로 표현식과 일치하는 경우 path/to
다음 find
과 cp
같이 사용하십시오.
find ./path/to/* -type d -exec cp [file name] {} \;
그게 다야.
find
스레드에서 사용 하는 다른 모든 답변에 투표를 주었기를 바랍니다 .
더 깊은 곳으로 가고 싶다면 -maxdepth
매개 변수를 조정하여 즉시 하위 디렉토리에 복사합니다 .
find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html
모든 디렉토리에 복사하지 않으려면, 원하는 디렉토리를 필터링 할 수 있습니다. 예를 들어 시작하는 모든 폴더로 복사 a
find . -mindepth 1 -maxdepth 1 -type d| grep \/a |xargs -n 1 cp -i index.html
임의의 / 분리 된 디렉토리 세트로 복사하는 경우 Robert Gamble의 제안이 필요합니다.
파일을 여러 디렉토리에 복사하고 싶습니다.
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
. 디렉토리를 다른 디렉토리에 복사합니다.
cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
나는 그것이 여러 명령을 내리는 것과 같다는 것을 알고 있지만 1 줄을 입력하고 잠시 걸어 가려고 할 때 잘 작동합니다.
예를 들어 대상 폴더의 상위 디렉토리에있는 경우 다음을 수행 할 수 있습니다.
$ (ls)에서 i의 경우; cp 소스 파일을 수행하십시오 $ i; 끝난
ls
항상 변수를 인용하십시오. for i in ./*; do cp sourcefile "$i"; done