gnu cp 명령을 사용하여 파일을 여러 디렉토리에 복사하는 방법


210

cp 명령을 사용하여 단일 파일을 여러 디렉토리에 복사 할 수 있습니까?

작동하지 않는 다음을 시도했습니다.

cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}

for 루프 또는 찾기를 사용하는 것이 가능하다는 것을 알고 있습니다. 그러나 gnu cp 명령을 사용하는 것이 가능합니까?

답변:


106

아니요, cp여러 소스를 복사 할 수 있지만 단일 대상으로 만 복사됩니다. cp원하는 작업에 대해 대상마다 한 번씩 여러 번 호출하도록 준비해야합니다 . 당신이 말하는 것처럼, 루프 또는 다른 도구를 사용합니다.


답변 해주셔서 감사합니다! 추가 플래그 (존재하지 않음)없이 cp는 소스가 무엇인지, DEST 디렉토리가 무엇인지 알지 못합니다.
Tom Feiner

10
이것은 정답이 아닙니다. Robert Gamble의 답변을 참조하십시오.
PlagueHammer 2013

23
@Nocturne : 내가 말한 것의 어느 부분이 올바르지 않습니까? Robert는 다른 도구를 사용하여 cp를 여러 번 호출하는 예를 제시합니다. 다른 도구 나 구성을 사용하여이를 수행하는 데 사용할 수있는 솔루션이 많이 있지만 OP는 이미 가능하다는 것을 이미 알고있었습니다.
moonshadow

2
안타깝게도 cp (및 scp)가 해당 기능을 지원하는 것이 좋습니다. 그러나 티를 사용하여 분할을 수행 할 수 있습니다. superuser.com/questions/32630/…
Simon

4
@moonshadow : 물론 대답은 정확합니다. PlagueHammer는 이러한 맥락에서 다른 대답이 더 유용하다고 말하고 싶습니다. 아마도 당신도 당신의 대답에 그런 것을 포함 할 수 있습니까?
Peaceful

585

당신이 할 수 없습니다 cp만 그러나 당신은 결합 할 수 있습니다 cp으로 xargs:

echo dir1 dir2 dir3 | xargs -n 1 cp file1

복사 것인가 file1dir1, dir2그리고 dir3. xargscp작업을 수행하려면 3 번 전화 xargs하십시오. 자세한 내용은 맨 페이지 를 참조하십시오.


3
xargs에 대한 자세한 정보 : cyberciti.biz/faq/…
Chris Bier

24
@Simon 어떻게 그렇게? " cp혼자서만 이 작업을 수행 할 수 없습니다. "다른 방법을 제안하여 도움이 되려고했다고해서 해당 질문에 답변이되지 않았다는 의미는 아닙니다.
Nicole

3
@NickC asker는 다음과 같이 지정했다. 좋은 대답은 받아 들여지는 것입니다.
Simon

25
기술적으로 질문에 답변하는지 여부에 따라 답변을 수락하도록 명시하는 것은 견고 할 정도로 비현실적이며 실제로 유용하지 않습니다.
주사위 놀이

4
매우 도움이되었습니다! 나와 같은 다른 초보자의 경우 : cp와 함께 정규식을 사용할 수 없지만이 명령의 첫 부분 (예 :)에서 사용할 수 있습니다 echo dir[1-3] | xargs -n 1 cp filename.
Jason

77

와일드 카드는 Roberts 코드와도 작동

echo ./fs*/* | xargs -n 1 cp test 

그리고 전체 의견 ... 예를 들어, 내 데스크탑에있는 루트 소유 파일 (실제로 symlink)을 모든 사용자 데스크탑으로 옮기려면 먼저 sudo su (다른 방식으로는 작동하지 않음)를 사용하고 다음과 같이 사용하십시오. echo / home / * / Desktop / | xargs -n 1 cp -av / home / myusername / Desktop / file.
David G

19

내가 볼 수있는 한 다음을 사용할 수 있습니다.

ls | xargs -n 1 cp -i file.dat

-i의 옵션 cp명령 수단은 당신이 가진 현재 디렉토리에있는 파일을 덮어 쓸 것인지 묻는 메시지가됩니다 file.dat. 완전 자동 솔루션은 아니지만 나에게 도움이되었습니다.


1
-i가드를 추가하는 것이 좋지만 모든 파일을 덮어 쓰라는 메시지가 표시되지 않습니까? 디렉토리에 복사하는 대신?
Hedgehog

1
@Hedgehog 글쎄,이 명령은 디렉토리에 파일이 있고 디렉토리의 하위 디렉토리에 파일을 복사하려고 할 때 유용하다고 생각합니다. 이 경우 파일을 한 번만 덮어 쓸 수 있습니다. 질문 해 주셔서 감사합니다!
Evgeny

2
나에게 일련의 cp: overwrite질문을 인쇄 했지만 그중 하나에 대답 할 필요가 없었고 파일을 덮어 쓰지 않았습니다.
Evgeni Sergeev

또한 일련의 질문을 인쇄하고 마지막에 ':'문자를 가진 dir이라는 이름으로 파일에 복사했습니다. 전혀 해결책이 없습니다. Paul의 해결책은 완벽하게 작동합니다.
jgpATs2w

19

내가 사용하는 것이 cat그리고 tee내가에서 본 응답에 따라 /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets 대신 cp.

예를 들면 다음과 같습니다.

cat inputfile | tee outfile1 outfile2 > /dev/null

1
방금 실행 한 커서 테스트는 대상이 다른 물리적 드라이브 인 경우 (디지털 필름의 소스 비디오와 같은 파일 기반의 물리적 사본 두 개를 유지하는 경우)이 성능이 가장 우수함을 보여줍니다.
curiouser

1
bash 3.0 이상을 사용하는 경우 다음과 같이 범위를 사용할 수 있습니다.cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
Samuel

tee < inputfile outfile1 outfile2 > /dev/nullTaywee의 답변에 표시된 유용한 패턴이기도합니다. cat에서 배관 할 필요가 없도록 '<'와 함께 io-redirection을 사용하십시오.
Alex Telon

10

이 답변은 모두 명백한 것보다 더 복잡해 보입니다.

for i in /foo /bar; do cp "$file1" "$i"; done

우아하고 작동하며 현재 디렉토리의 모든 디렉토리에 대해 사용할 수 있습니다. for d in */ ; do cp $file "$i" done
FantomX1

9

ls -db di*/subdir | xargs -n 1 cp File

-b디렉토리 이름에 공백있는 경우 xargs에 의해 다른 항목으로 분리됩니다. 에코 버전과 관련 하여이 문제가 발생했습니다.


6

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 호출)보다 확실히 빠릅니다.


5

복사를 사용하여 xargs맥 OS, 나를 위해 일한 유일한 해결책에 와일드 카드를 사용하여 디렉토리 디렉토리 이름은 공백 :

find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test 

어디에서 test복사 할 파일
./fs*/*복사 할 디렉토리는

문제는 xargs가 공백을 새로운 인수로 간주한다는 것 입니다. Mac OS 에서 구분 기호 문자를 변경 -d하거나 -E안타깝게도 Mac OS에서 제대로 작동하지 않습니다.


4

분기 명령없이 수행하려면 다음을 수행하십시오.

tee <inputfile file2 file3 file4 ... >/dev/null


2

본질적으로 xargs 답변과 동일하지만 병렬 실행을 원할 경우 :

parallel -q cp file1 ::: /foo/ /bar/

예를 들어, file1을 현재 폴더의 모든 하위 디렉토리 (재귀 포함)에 복사하려면 다음을 수행하십시오.

parallel -q cp file1 ::: `find -mindepth 1 -type d`

주의 : 이것은 각각의 대상 디렉토리가 별개의 디스크 인 경우와 같이 매우 특정한 사용 사례에 대해 눈에 띄는 속도 향상만을 전달할 것입니다.

또한 xargs의 '-P'인수와 기능적으로 유사합니다.


0

아니 당신은 할 수 없습니다.

여러 번이 기능을 사용할 수 있다는 것을 알게 되었기 때문에이를위한 도구를 직접 만들었습니다.

http://github.com/ddavison/branch

꽤 간단합니다-
branch myfile dir1 dir2 dir3


필자가 이런 스크립트를 작성하는 시나리오가 종종 있지만, 요즘에는 너무 많은 컴퓨터를 사용하여 동기화를 유지하는 것이 큰 번거 로움과 같습니다. /e예를 들어 클라우드 웹 디렉토리를 각 시스템에 한 번만 마운트하는 방법 만 있다면 , 나만의 powertools를 작성하여 영원히 유지할 수 있습니다.
Evgeni Sergeev

0
ls -d */ | xargs -iA cp file.txt A

1
약간의 설명은 어떻습니까?

이것은 실제로 작동하지만 설명은 훌륭했을 것입니다
Ælex

0

fileName.txt현재 작업 디렉토리 내의 모든 서브 디렉토리 에 복사하려고한다고 가정하십시오 .

  1. 모든 하위 디렉토리 이름을 가져 ls와서 임시 파일에 저장하십시오.allFolders.txt

    ls > allFolders.txt
  2. 목록을 인쇄하여 command로 전달하십시오 xargs.

    cat allFolders.txt | xargs -n 1 cp fileName.txt

0

다른 방법은 다음과 같이 고양이와 티를 사용하는 것입니다.

cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>

작업이 여러 프로세스 (대상 당 하나)로 분할되고 하드 드라이브가 플래터의 다른 부분에 여러 파일을 한 번에 작성하기 때문에 이것은 매우 비효율적이라고 생각합니다. 그러나 파일을 여러 개의 다른 드라이브에 쓰려면이 방법이 효과적 일 것입니다 (모든 사본이 동시에 발생할 수 있음).


0

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

나는 이것을 downvote에게 주었다. 이 질문은 구체적으로 비 루프 솔루션을 요구했습니다.
Alex Telon

-1

여러 폴더를 여러 폴더에 복사하려면 다음과 같이하십시오.

echo dir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1, subdir2, subdir3}


-1

모든 대상 디렉토리가 모든 하위 디렉토리처럼 경로 표현식과 일치하는 경우 path/to다음 findcp같이 사용하십시오.

find ./path/to/* -type d -exec cp [file name] {} \;

그게 다야.


나는 이것을 downvote에게 주었다. 이 질문은 구체적으로 비 찾기 솔루션을 요구했습니다.
Alex Telon

@AlexTelon을 철저히 작성해 주셔서 감사합니다. 나는 그 비트를 놓친 것 같아요. 나는 당신이 일관성을 유지하고 find스레드에서 사용 하는 다른 모든 답변에 투표를 주었기를 바랍니다 .
Mig82

-2

파일을 복사 할 폴더를 지정해야하는 경우 find를 하나 이상의 grep과 결합 할 수 있습니다. 예를 들어 하위 폴더에서 favicon.ico를 대체하려면 다음을 사용할 수 있습니다.

find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico

-3

더 깊은 곳으로 가고 싶다면 -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의 제안이 필요합니다.


-3

파일을 여러 디렉토리에 복사하고 싶습니다. 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 줄을 입력하고 잠시 걸어 가려고 할 때 잘 작동합니다.


7
당신은 15 다른 답변 6 살짜리 질문에 대답하고 있습니다. 당신의 대답은 매우 참신해야합니다. 내 의견은 아닙니다.
Craig S. Anderson

-4

예를 들어 대상 폴더의 상위 디렉토리에있는 경우 다음을 수행 할 수 있습니다.

$ (ls)에서 i의 경우; cp 소스 파일을 수행하십시오 $ i; 끝난


문제는 for 루프로 가능하다는 것이므로 실제로 아무것도 추가하지 않습니다.
LJNielsenDk 2016 년

공감. 의 출력을 구문 분석하지 말고ls 항상 변수를 인용하십시오. for i in ./*; do cp sourcefile "$i"; done
sleblanc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.