2014-05-16 4 views
43

기존 디렉토리를 덮어 쓸 Bash 스크립트를 작성하려고합니다. 그래서 나는 foo 디렉토리를 가지고 있고 bar /를 덮어 쓰려고합니다. 하지만 내가 할 때,강제로 'cp'가 내부에 다른 것을 만드는 대신 디렉토리를 덮어 쓰게하는 방법?

cp -Rf foo/ bar/ 

새로운 바/foo/디렉토리가 생성된다는 것은 어떻게됩니까? 나는 그것을 원하지 않는다. foo/a와 b에는 두 개의 파일이 있습니다. bar /에 같은 이름의 파일이 있습니다. foo/a와 foo/b가 bar/a와 bar/b를 대체하기를 원합니다.

답변

5

사용이 cp 명령을

cp -Rf foo/* bar/ 
+4

바에 있지만 foo에는없는 파일은 제거되지 않습니다. – Ara

+1

그 의미가 무엇인지 모르시겠습니까? 왜'cp' 명령이 소스에서 파일을 제거해야합니까? – anubhava

+0

필자는 기존 디렉터리를 다른 디렉터리로 덮어 쓰면 결국 덮어 쓴 디렉터리가 다른 디렉터리의 복사본이어야한다고 생각했습니다. 즉, @ jonathan-wheeler 응답의 경우와 같이 foo의 사본이어야하지만 파일 표시 줄/c 및 foo/c가없는 경우 bar/c가 삭제되지 않습니다. 사이드 노트에서, 저는 Saurabh Meshram의 대답 중 하나가 아닌 것으로 나타났습니다. – Ara

19

이 두 단계를 수행하십시오.

rm -r bar/ 
cp -r foo/ bar/ 
+0

이것은 그가 한 명령에서 그것을 원한다고 생각하지만, 이것은 괜찮아 보입니다. –

+7

이것은 실제로 'bar'가 'foo'의 내용과 'foo'의 내용이 동일하고 'bar'에 이미 존재할 수있는 다른 항목의 조합이 아니라 'bar'가 내용과 'foo'가 동일 함을 보증하는 ** 유일한 ** 예제입니다 '. 아래의 @Saurabh Meshram에서 크게 upvoted 답변이 문제가 있습니다. – robo

+1

숨겨진 파일이라도 바에서 모든 파일을 제거하므로 * 사용시주의하십시오. –

52

당신은 cp이 사용 -T 옵션을 할 수 있습니다.
cp에 대한 man 페이지를 참조하십시오.

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

따라서 파일 구조는 다음과 같습니다.

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

Verbose에 -v을 사용하면 명확한 차이점을 확인할 수 있습니다.
-R 옵션 만 사용하는 경우. 당신이 옵션 -T을 사용하면

$ 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 

는 정상적인 파일이 아닌 디렉토리 같은 대상을 치료 , 내용을 덮어 씁니다.

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

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

이렇게하면 문제가 해결됩니다.

+9

누군가가이 문제로 인해 작동하지 않을 경우를 대비하여 OSX cp https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages에서 작동하지 않습니다. /man1/cp.1.html – dnfehren

+5

위의 예에서는 문제를 숨기고 있지만이 대답은 OP가 찾고있는 것이 명확하지 않습니다 ... -T 옵션을 사용하면 기존 대상 ('bar /')하지만 소스 ('foo /')에있는 * not *는 그대로 남아 있기 때문에 이것은 대부분의 사람들이 디렉토리를 완전히 덮어 쓸 것이라고 생각하지는 않습니다. 예. 'bar/baz'가 이미 존재한다면, 그것은 여전히 ​​존재할 것입니다 ... – robo

+0

과정에서 목표 폴더를 지울 수있는 옵션이 있습니까? 나는 그것을 믿을 수 없다! – JohnyTex

3

다음 명령은 dotfiles (숨김 파일) 사본에 포함되어 보장 :

$ cp -Rf foo/. bar 
+1

이 명령을 앞에 붙이면 대상 폴더를 지울 수 있습니까? 특이하게 보입니다. – Mateng

+2

@Mateng 방금 테스트했습니다. 맞습니다. – Matmarbon

1

@ 조나단 휠러 매우 유사 : 당신이 기억하고 싶지,하지만 bar를 다시 작성하지 않는 경우

:

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

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

+1

! $에 대한 팁은 정말 멋지다! –