명령 줄을 사용하여 파일을 여러 폴더로 복사하는 방법은 무엇입니까?


67

test.txt하나의 명령 으로 파일 을 여러 디렉토리 에 복사하려고했습니다 .

cp ~/test.txt ~/folder1 ~/folder2

그러나 나는 성공하지 못했습니다. 하나의 명령으로 파일이나 폴더를 여러 디렉토리에 복사 할 수있는 방법이 있습니까?


쉽지 않습니다. 폴더의 여러 기존 사본을 효율적으로 업데이트하기 위해 "rsync"를 살펴볼 수 있습니다.
Thorbjørn Ravn Andersen

3
약간의 bash 스크립트를 배우십시오. 매우 유용 할 수 있습니다 :for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
Shahbaz

하나의 명령이 아니라 여기를 우연히 발견하는 일부 사람들을 도울 수 있습니다.cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
Manu Järvinen

답변:


71

cp여러 소스에서 복사 할 수 있지만 여러 대상으로 복사 할 수는 없습니다 . 자세한 내용 man cp은 참조하십시오 .

여러 대상에 복사 / 저장할 수있는 유일한 bash 명령은 tee입니다.

다음과 같이 귀하의 경우에 사용할 수 있습니다.

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

참고 tee또한 표준 출력 (표준 출력)에 입력을 기록한다. 따라서 이것을 원하지 않으면 표준 출력을 /dev/null다음과 같이 리디렉션하여 방지 할 수 있습니다 .

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null

10
영리합니다. :)
terdon

5
+1, 영리하다! 그리고 >/dev/null터미널을 엉망으로 만들지 않고 바이너리 파일로 작품 을 사용한다면 ...
Rmano

1
+1 당신을 위해 항상 당신의 maman :),하지만 디렉토리를 복사하려면 어떻게해야합니까?
nux

2
@nux 디렉토리의 경우 -r옵션 을 사용하는 것을 잊지 마십시오cp
Radu Rădeanu

4
@nux : tee달리 cp만 복사 파일의 내용은 모드, 소유권, 타임 스탬프를 무시. 파일 이름의 반복을 피하려면 :f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
jfs

61

여러 위치로 복사하는 다른 방법은 다음 명령입니다.

find dir1 dir2 -exec cp file.txt {} \;

dir1 또는 dir2에 파일을 복사하지 않으려는 하위 디렉토리가 있으면 -maxdepth 0옵션을 추가하십시오 .

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

이에있는 모든 파일을 덮어 씌 dir1dir2함께 file.txt그것을 복사 이외에 's의 내용. file.txt이 디렉토리의 다른 파일에 영향을주지 않고 복사 만하 려면 디렉토리 find에서만 작동하도록 지시하십시오.

find dir1 dir2 -type d -exec cp file.txt {} \;

4
좋은 해결책! 티보다 더 완벽한 것 같습니다.
Danatela

1
실제로 리디렉션은 포함되지 않으며 여전히 하나의 명령입니다.
Sylvain Pineau

2
@SylvainPineau 실제로 3 find개가 있습니다 (이 경우) cp. 말할 것도 find없이 많은 시간 이 필요합니다.
Radu Rădeanu

3
"command"의 정의가 "exec"호출 인 경우, 그러나 이것은 내 책에서 "하나의 명령"입니다.
kojiro

2
나는 이것으로 계속 돌아와서, 나는 공의를 표명해야한다고 생각했다. : D
Jonathan

31

명령

cp ~/test.txt ~/folder1 ~/folder2

두 파일 ( ~/test.txt~/folder1)을 대상 으로 복사하려고 합니다 folder2. (그리고 ~/folder2존재하고 디렉토리 인 경우 "디렉토리 생략"경고가 표시됩니다).

파일의 사본을 여러 개 만들려면 test.txt루프 나 여러 명령을 사용해야합니다.

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(... 파일 이름에 공백이 포함되어 있으면 인용 부호가 필요합니다).

전체 디렉토리를 복사하려면 다음 -r옵션 을 사용해야합니다 .

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

이 생성됩니다 ~/folder1/folder3~/folder2/folder3모든 파일이 포함와.


1
전달 독자의 경우 : spec 에 따르면 for 루프는 복합 명령입니다. 따라서 이것은 여전히 하나의 명령이며 질문에 대한 모든 요구 사항을 충족합니다.
kojiro

@ nux, 나는 정정에 동의하지 않습니다. 1) 두 수도가 잘못되었습니다. 내 의도는 명령을 문구에 삽입하는 것이 었습니다. 2) 줄임표는 스타일의 문제입니다. 내 스타일을 알려주세요.
Rmano

1
알았어, 미안하다, 나아질 거라 생각했다.
nux

내 시스템에서는 folder3을 ~ / folder1 / folder3으로 저장하지 않고 오히려 folder3의 모든 것을 folder1에 복사합니다.
alpha_989

23

도움말 스크립트를 작성하거나 xargs인쇄 기능 (이 경우 echo)을 사용 하여 수행 할 수 있습니다 .

echo firstDir secondDir | xargs -n 1 cp test

테스트 파일을 매개 변수로 cp사용하여 각 디렉토리를 함수 의 인수로 만듭니다.


이것은 아마도 질문에 대한 가장
좋고

7

긴 검색 후에도 매력처럼 작동합니다!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

터미널의 현재 위치에있는 모든 디렉토리에 file.txt 가 복사됩니다 .

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

터미널의 현재 위치에있는 모든 하위 디렉토리에 폴더가 복사됩니다.

나는 그것이 다른 사람들에게도 도움이되기를 바랍니다.


에서 zsh, 당신이 사용할 수있는 for i in *(/); ...모든 하위 디렉토리에 걸쳐 루프, 그래서 당신은 피할 수 [ -d ...테스트를. 확장 글 로빙은 내가 좋아하는 이유 중 하나입니다 bash.
Rmano

오른쪽 명령에 다시 코딩 할 수 있습니다
NUX

1
에서는 zsh,이 응답의 첫번째 명령은 다음과 같이 단순화 될 수있다 for dir in *(/); do cp /path/file.txt "$dir"; done. 14:01의 zsh.sourceforge.net/Intro/intro_2.html
Rmano

5
다음을 사용하여 Bourne 파생 쉘에서 테스트를 제거 할 수 있습니다.for dir in */;
Henk Langeveld

@nux 이것은 정말 잘 작동하며 명령을 수행하기가 매우 쉽습니다. 훨씬 더 높은 표를 뽑아야합니다!
nukeguy

1

/ tmp / target /의 모든 디렉토리에 test.txt 파일을 복사하려면 ...

테스트 환경을 만듭니다.

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

그것을 복사하십시오 :

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;

0

그냥 대답에 변화를 줄 생각 Sylvain Pineau

현재 디렉토리의 어디에 dir1있고 dir2없습니다.

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

여기에서 find는 dir1두 가지 수준의 깊이를 찾거나 현재 디렉토리와 그 아래의 모든 폴더에서 -maxdepth찾을 매개 변수를 남겨 둘 수 있습니다 dir1.

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