답변:
의 -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
-v
Verbose 를 사용하면 분명한 차이점을 알 수 있습니다 .
그냥 -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
이것은 당신의 문제를 해결할 것입니다.
bar/
하지만) 하지 소스 (에 foo/
남아있을 것입니다) 그래서 이것은 대부분의 사람들이 디렉토리를 완전히 덮어 쓰는 것으로 간주하는 것이 아닙니다. 즉. 경우 bar/baz
이미 존재, 그것은 여전히 ... 나중에 존재하는 것
rm -rf bar/* && cp -TRv foo/ bar/
두 단계로 수행하십시오.
rm -r bar/
cp -r foo/ bar/
bar
내용이 동일하다는 것을 보장합니다 . 아래 @Saurabh Meshram의 높은 찬성 답변에는이 문제가 있습니다. foo
foo
bar
rm -rf bar/; cp -r foo/ !$
foo
및 bar
대형 디렉토리입니다 ... 어쩌면에있는 파일이 있습니다 bar
에없는 foo
제거 싶지 않아. 이것은 현실적인 대답으로 간주되지 않아야합니다. imho
당신을 보장하려면 bar/
동일한까지 끝을 foo/
사용 rsync
하는 대신 :
rsync -a --delete foo/ bar/
몇 가지만 변경된 경우 전체 디렉토리를 제거하고 다시 복사하는 것보다 훨씬 빠르게 실행됩니다.
-a
파일을 충실히 복사하는 '아카이브 모드'입니다 foo/
.bar/
--delete
foo/
에서 없는 추가 파일도 제거 bar/
하여bar/
하여 동일한 결과를 합니다.-vh
장황하고 사람이 읽을 수 있도록foo
가 필요합니다. 그렇지 않으면rsync
덮어 쓰지 않고 복사 foo/
됩니다.bar/foo/
bar/
자신을.
foo/
내용에 bar/
우리, 모두에 슬래시를 사용 그것은 혼란 때문에 의지에 슬래시로 예상대로되지 작업. 도 불구하고, 그것은 소스에 슬래시의 부재를 존중하더라도, 그것은 슬래시를 가지고 것처럼 rsync를가 저변에서 항상 대상 경로를 해석 우리는 복사 할 경우 경로. 우리가 소스 경로에 슬래시가 필요 그래서, 그것은 대상 경로에 자동으로 추가 슬래시를 일치하도록하는 내용 의을 foo/
로 bar/
오히려 디렉토리보다,foo/
로 착륙 bar/
합니다 bar/foo
.)rsync
ssh를 통한 복사와 같은 다른 작업을 할 수 있는지 궁금하다면 매우 강력하고 유용합니다.
cp -T
그것은 또한 👍에서라도에서 작동하기 때문에 옵션
다음 cp
명령을 사용하십시오 .
cp -Rf foo/* bar/
cp
명령이 소스에서 파일을 제거 해야하는 이유는 무엇 입니까?
다음 명령은 dotfile (숨겨진 파일)이 복사본에 포함되도록합니다.
$ cp -Rf foo/. bar
.
디렉토리의 모든 파일을 의미합니다. 따라서 자연스럽게 숨겨진 파일이 포함됩니다.
@Jonathan Wheeler와 매우 유사합니다.
기억하고 싶지 않지만 다시 작성하지 않으려면 다음을 수행하십시오 bar
.
rm -r bar/
cp -r foo/ !$
!$
이전 명령의 마지막 인수를 표시합니다.