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

복사 것인가 file1에 dir1, dir2그리고 dir3. xargs이 cp작업을 수행하려면 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다음 find과 cp같이 사용하십시오.

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.