source

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

manycodes 2023. 5. 11. 21:35
반응형

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

기존 디렉터리를 덮어쓸 Bash 스크립트를 작성하려고 합니다.디렉토리가 있습니다.foo/그리고 나는 덮어쓰려고 노력하고 있습니다.bar/그것과 함께.하지만 내가 이렇게 할 수 있어요.

cp -Rf foo/ bar/

신참의bar/foo/디렉토리가 생성됩니다.나는 그것을 원하지 않는다.두 개의 파일이 있습니다.foo/;a그리고.b이름이 같은 파일이 있습니다.bar/뿐만 아니라.나는 그것을 원합니다.foo/a그리고.foo/b대체할bar/a그리고.bar/b.

다음을 사용하여 이 작업을 수행할 수 있습니다.-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장황하게.
그냥 사용할 때-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/,사용하다rsync대신:

rsync -a --delete foo/ bar/

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

  • -a파일을 충실히 복사하는 '파일 모드'입니다.foo/로.bar/
  • --delete에 없는 여분의 파일 제거합니다.foo/부터bar/또한, 보장합니다.bar/동일한 결과가 됩니다.
  • 작업 내용을 보려면 다음을 추가-vh장황하고 사람이 읽을 수 있는.
  • 참고: 다음 슬래시foo필수, 그렇지 않은 경우rsync복사할 것입니다foo/로.bar/foo/덮어쓰는 것보다bar/그 자체로
    • (rsync 디렉터리 뒤의 슬래시는 혼란스럽습니다. 관심이 있으시다면 여기 특종이 있습니다.그들은 rsync에 디렉터리 자체가 아닌 디렉터리의 내용을 참조하라고 말합니다.내용을 덮어쓰려면foo/의 내용에 관하여bar/둘 다 슬래시를 사용합니다.하지만 슬래시를 사용해도 예상대로 작동하지 않기 때문에 혼란스럽습니다. rsync는 소스 경로에 슬래시가 없는 경우에도 항상 슬래시가 있는 것처럼 대상 경로를 몰래 해석합니다.따라서 대상 경로의 자동 추가 슬래시와 일치하도록 하려면 소스 경로에 슬래시가 필요합니다.foo/안으로bar/디렉토리가 아닌foo/에 착륙하는 것 자체가.bar/~하듯이bar/foo.)

rsync이 기능은 매우 강력하고 유용하며, SSH를 통한 복사와 같은 다른 기능이 있는지 확인할 수 있습니다.

두 단계로 나누어 진행합니다.

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

하기 »cp명령:

cp -Rf foo/* bar/

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

$ cp -Rf foo/. bar

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

기억하고 싶지는 않지만 다시 쓰고 싶지 않은 경우bar:

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

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

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

\cp -rf foo/* bar/

Windows용 Git Bash인 경우:

robocopy path/to/source path/to/target -MIR

-MIR미러를 의미합니다. 동일한 폴더가 두 개 생성됩니다.기존 파일을 건너뛰고 추가 파일을 삭제합니다.

은 "이며 "병합"을 할 수 .cp 것을 수 있는 에는 폴더를 삭제합니다.bar그러면 간단히 할 수 있습니다.rm -rf bar폴더를 삭제한 다음mv foo bar이름을 변경합니다.두 작업 모두 파일 내용이 아닌 파일 포인터로 수행되므로 시간이 걸리지 않습니다.

다음 명령을 사용해 보십시오.

cp -Rf foo/* bar/

언급URL : https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside

반응형