내부에 다른 디렉터리를 만드는 대신 'cp'가 디렉터리를 덮어 쓰도록 강제하는 방법은 무엇입니까?


107

기존 디렉터리를 덮어 쓰는 Bash 스크립트를 작성하려고합니다. 디렉토리가 foo/있고 덮어 쓰려고 bar/합니다. 하지만 이렇게하면 :

cp -Rf foo/ bar/

bar/foo/디렉토리가 생성됩니다. 나는 그것을 원하지 않는다. 에 두 개의 파일이 있습니다 foo/. ab. 같은 이름의 파일 bar/도 있습니다. 내가 원하는 foo/afoo/b교체 bar/abar/b.

답변:


122

-T옵션을 사용하여이 작업을 수행 할 수 있습니다 cp.
에 대한 매뉴얼 페이지를 참조하십시오 cp.

-T, --no-target-directory
    treat DEST as a normal file

따라서 귀하의 예에 따라 다음은 파일 구조입니다.

$ tree test
test
|-- bar
|   |-- a
|   `-- b
`-- foo
    |-- a
    `-- b
2 directories, 4 files

-vVerbose 를 사용하면 분명한 차이점을 알 수 있습니다 .
그냥 -R옵션 을 사용할 때 .

$ cp -Rv foo/ bar/
`foo/' -> `bar/foo'
`foo/b' -> `bar/foo/b'
`foo/a' -> `bar/foo/a'
 $ tree
 |-- bar
 |   |-- a
 |   |-- b
 |   `-- foo
 |       |-- a
 |       `-- b
 `-- foo
     |-- a
     `-- b
3 directories, 6 files

이 옵션을 사용하면 -T내용을 덮어 쓰고 대상을 디렉토리가 아닌 일반 파일처럼 취급합니다 .

$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'

$ tree
|-- bar
|   |-- a
|   `-- b
`-- foo
    |-- a
    `-- b
2 directories, 4 files

이것은 당신의 문제를 해결할 것입니다.


22
다만 경우에 사람이에 의해 트립 그 것이다 OSX의 CP하지 작업 developer.apple.com/library/mac/documentation/Darwin/Reference/...
dnfehren

9
그것은이 대답은 위의 예는 문제를 마스크 있지만 영업 이익은 기존 대상 (에 -T 옵션 파일과 함께 ... 무엇을 찾고 있음을 분명하지 않다 bar/하지만) 하지 소스 (에 foo/남아있을 것입니다) 그래서 이것은 대부분의 사람들이 디렉토리를 완전히 덮어 쓰는 것으로 간주하는 것이 아닙니다. 즉. 경우 bar/baz이미 존재, 그것은 여전히 ... 나중에 존재하는 것
로보

1
이 대답은 op 질문에 대답하지만 대상이 이미 존재하고 포함 된 내용을 제거하고 싶지만 원본 디렉토리가없는 경우의 경우를 다루지 않습니다. 이것은 한 곳에서 다른 곳으로 파일을 복사하는 예상되는 동작이 아닙니다. 소스에도있는 대상 항목 만 덮어 쓰고 소스에없는 대상 항목은 건드리지 않습니다. 당신은 그것을 할 명령을 앞에 붙이는 대상 폴더를 정리할 수 있습니다 :rm -rf bar/* && cp -TRv foo/ bar/
theferrit32

1
나는 마인드 리더가 아닙니다. OP가 뭘 찾고 있는지 더 이상 설명하지 못합니다.하지만 이것은 확실히 제가 (MEEEE)가 찾던 대답이었습니다
Assimilater

2
가장 많이 찬성 된 댓글의 링크가 작동하지 않는 이유에 대해 누군가가 실패한
Sulfur

48

두 단계로 수행하십시오.

rm -r bar/
cp -r foo/ bar/

11
이것은 실제로 지금까지 제공된 유일한 예로서 에서 이미 존재했을 수있는 다른 항목과 의 조합이 아니라 bar내용이 동일하다는 것을 보장합니다 . 아래 @Saurabh Meshram의 높은 찬성 답변에는이 문제가 있습니다. foofoobar
robo

1
그것으로,이를 사용하여 추가주의해야 합니다 바, 심지어 숨겨진에서 모든 파일을 제거합니다.
Elia Grady

mac osx : rm -rf bar/; cp -r foo/ !$
Michael Dimmitt 2011 년

1
이것은 항상 가능한 ... 또는 원하는 ... 경우 상상할 수없는 foobar대형 디렉토리입니다 ... 어쩌면에있는 파일이 있습니다 bar에없는 foo제거 싶지 않아. 이것은 현실적인 대답으로 간주되지 않아야합니다. imho
Assimilater

나를 위해 일했지만 foo /에는 파일이 포함되어 있지만 bar /에는 포함되지 않을 수 있으므로 최상의 솔루션은 아닙니다.
Nitwit

46

당신을 보장하려면 bar/동일한까지 끝을 foo/사용 rsync하는 대신 :

rsync -a --delete foo/ bar/

몇 가지만 변경된 경우 전체 디렉토리를 제거하고 다시 복사하는 것보다 훨씬 빠르게 실행됩니다.

  • -a파일을 충실히 복사하는 '아카이브 모드'입니다 foo/.bar/
  • --deletefoo/에서 없는 추가 파일도 제거 bar/하여bar/ 하여 동일한 결과를 합니다.
  • 수행중인 작업을 보려면 다음을 추가하십시오. -vh 장황하고 사람이 읽을 수 있도록
  • 참고 : 뒤에 슬래시 foo가 필요합니다. 그렇지 않으면rsync 덮어 쓰지 않고 복사 foo/됩니다.bar/foo/bar/ 자신을.
    • (rsync와의 디렉토리 후 슬래시는 혼동, 당신은 여기 특종 관심이 있다면 그들은을 참조 rsync를 말한다. 내용 이 아니라 디렉토리보다 디렉토리의 자체 따라서는에서 덮어 쓸 수 있습니다. 내용foo/내용에 bar/우리, 모두에 슬래시를 사용 그것은 혼란 때문에 의지에 슬래시로 예상대로되지 작업. 불구하고, 그것은 소스에 슬래시의 부재를 존중하더라도, 그것은 슬래시를 가지고 것처럼 rsync를가 저변에서 항상 대상 경로를 해석 우리는 복사 할 경우 경로. 우리가 소스 경로에 슬래시가 필요 그래서, 그것은 대상 경로에 자동으로 추가 슬래시를 일치하도록하는 내용 의을 foo/bar/오히려 디렉토리보다,foo/로 착륙 bar/합니다 bar/foo.)

rsync ssh를 통한 복사와 같은 다른 작업을 할 수 있는지 궁금하다면 매우 강력하고 유용합니다.


1
더 이상이 답변처럼 cp -T그것은 또한 👍에서라도에서 작동하기 때문에 옵션
tongueroo

18

다음 cp명령을 사용하십시오 .

cp -Rf foo/* bar/

9
이것은 bar에 있지만 foo에는없는 파일을 제거하지 않습니다.
Ara

5
그게 무슨 뜻인지 모르겠어요. cp명령이 소스에서 파일을 제거 해야하는 이유는 무엇 입니까?
anubhava

내 이해는 '기존 디렉토리를 다른 디렉토리로 덮어 쓸 때'결국 덮어 쓴 디렉토리는 다른 디렉토리의 사본이어야한다는 것입니다. 즉, @ jonathan-wheeler 답변의 경우와 같이 끝 막대에 foo의 복사본이 있어야하지만 파일 bar / c가 있고 foo / c가 없으면 bar / c가 삭제되지 않습니다. 참고로, 나는 Saurabh Meshram의 대답에서도 그렇지 않다는 것을 알았습니다.
Ara

아마도 우리는 덮어 쓰기의 의미에 동의하지 않을 수 있습니다. 그녀가 foo와 bar에있는 2 개의 파일 만 언급했기 때문에 OP가 정확히 무엇을 원하는지 말하기는 어렵습니다.
Ara

이 구문은 숨겨진 도트 파일도 무시합니다. 많은 수는 또한 glob을 날려 버릴 수 있습니다.
xpusostomos

13

다음 명령은 dotfile (숨겨진 파일)이 복사본에 포함되도록합니다.

$ cp -Rf foo/. bar

1
이것이 사실입니까? 특이 해 보인다.
Mateng

2
@Mateng 방금 테스트했습니다-예, 사실입니다.
Matmarbon

1
.디렉토리의 모든 파일을 의미합니다. 따라서 자연스럽게 숨겨진 파일이 포함됩니다.
Jaspreet Singh 2018

실제로 꽤 깔끔합니다. Linux에서 "cp -RTf foo bar"를 수행 할 수도 있습니다.
xpusostomos

5

@Jonathan Wheeler와 매우 유사합니다.

기억하고 싶지 않지만 다시 작성하지 않으려면 다음을 수행하십시오 bar.

rm -r bar/
cp -r foo/ !$

!$ 이전 명령의 마지막 인수를 표시합니다.


4
! $에 대한 팁은 굉장합니다!
Lucas Morgan

0

이것은 당신의 문제를 해결할 것입니다.

\cp -rf foo/* bar/

-1

정의한 작업은 "병합"이며에서는이를 수행 할 수 없습니다 cp. 그러나 병합을 원하지 않고 폴더 bar를 잃어도 괜찮다면 폴더 rm -rf bar를 삭제 한 다음 mv foo bar이름을 바꾸면됩니다. 두 작업 모두 파일 내용이 아닌 파일 포인터에 의해 수행되므로 시간이 걸리지 않습니다.


-2

다음 두 단계로 구성된 명령을 사용해보십시오.

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