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


107

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

cp -Rf foo/ bar/

새 bar/foo/디렉토리가 생성됩니다. 나는 그것을 원하지 않는다. 에 두 개의 파일이 있습니다 foo/. a및 b. 같은 이름의 파일 bar/도 있습니다. 내가 원하는 foo/a및 foo/b교체 bar/a와 bar/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
이것은 항상 가능한 ... 또는 원하는 ... 경우 상상할 수없는 foo및 bar대형 디렉토리입니다 ... 어쩌면에있는 파일이 있습니다 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.