'cp'명령을 사용하여 디렉토리 내용 복사


33

한 디렉토리의 모든 내용을 다른 디렉토리에 어떻게 복사합니까?

예를 들면 다음과 같습니다.

$ cd /home/newuser
$ cp -a /backup/olduser/* .

위의 문제점은 글 로빙 패턴 '*'이 숨겨진 디렉토리 '.'와 일치한다는 것입니다. 그리고 '..'을 입력하면 내용뿐만 아니라 'newuser'안에 'olduser'디렉토리가 생깁니다.

다음과 같이 할 수도 있습니다 :

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

그러나 새로운 사용자가 이미 기본 파일과 디렉토리를 가지고 있다면 어떨까요?

기본 'cp'명령과 셸을 사용하여 한 디렉토리의 내용을 다른 디렉토리로 옮기는 가장 간단하고 정확하며 기억하기 쉽고 엉망인 방법은 무엇입니까?

답변:


31

시험:

cp -ra /backup/olduser/. /home/newuser

이것은 훌륭하지만 작동 방식을 정확히 알 수는 없습니다. 방법 ...작업을 이해하지 못했기 때문일 수 있습니다. 설명 할까?
bradley.ayers 오전

이것은 나를 위해 일했지만 cp -r ./a b그렇지 않았습니다. 왜 그런지 알아?
Brig

3
나에게도 효과가 있지만 r옵션은 필요하지 않습니다. 이 a옵션은을 의미합니다 r.
MountainX

1
이 시점에서 -r 매개 변수는 약간 중복 된 것으로 보입니다!
축하의

-a매개 변수는이 상황에서 도움을 아무것도하지 않는다. 이 명령 cp -r ./a/. b은 directory의 내용과 내용 만 directory a에 복사합니다 b. -a질문에 관련이없는 플래그 보존 링크, 타임 스탬프 등.
Steen Schütt

23

두 개의 디렉토리 a와 b.

둘 다 파일을 가지고 있습니다.

a와 b가 포함 된 디렉토리에 있습니다.

cp -r ./a b

-r = 재귀 적으로.


모든 파일을 가져 오기를 원하지 않습니까?
bw

7
-a 인수는 모든 파일과 관련이 없으며 아카이브의 길이가 짧고 파일 소유권, 권한, 액세스 시간 등을 보존합니다. -a 인수 (유용한 반면)는 표준 옵션이 아니며 여러 cp 구현은 제공하지 마십시오.
theotherreceive

1
당신은 말 했어요 때문에, 자동으로 포함 : @mch cp디렉토리를 복사 a하고,a/.somedotfile 에 포함됩니다 a. 경우에 b존재하는,이 명령의 정확한 복사본이 생성됩니다 a에서을 b/a.
quack quixote

2
쉬운 방법: cp -R /some/dir/* /another/dir
n0pe

1
이것은 a / foo를 b / foo 대신 b / a / foo에 복사합니다.
Sparr

19

기본적으로 두 번째 디렉토리가 있으면 cp첫 번째 디렉토리 두 번째 디렉토리 복사 합니다.

예를 들어 디렉토리 를에 cp -r a b복사 합니다 . 존재하지 않는 경우 의 컨텐츠로 작성됩니다 .abba

당신은 복사 할 경우 내용a로를 b사용 (예를 들어 마운트 지점에 전체 파일 시스템을 복사 할 때) :

cp -r a/. b

이전 답변에서와 같이.

또한 -a다른 답변 중 일부에 사용되는은 -dr --preserve=all타임 스탬프, 컨텍스트 및 확장 된 속성과 동일하며 보존됩니다.


어떻게 /.작동합니까?
bradley.ayers 오전

a/.는 디렉토리 자체와 달리 디렉토리 'a'의 내용을 나타냅니다. 대부분의 경우 동의어이지만을 사용할 때 cp -rcp 기본 동작을 피합니다 (INTO b 복사).
Nicolas Bonnefon

멋진 팁, 이것은 내가 찾고 있었지만 다른 곳을 찾지 못했습니다-모퉁이의 경우 실패하는 'foo / *'또는 '-r foo /'
Tener

@TimoHuovinen '.' 와일드 카드가 아닙니다. 말 그대로 "부모"디렉토리이고 '..'는 조부모입니다. 이것은 '/foo/./././././.'를 의미합니다. '/ foo'와 동일한 디렉토리이고 '/ foo / bar / ..'는 '/ foo'와 동일한 디렉토리입니다. 그것들을 파일 시스템에 내장 된 하드 링크로 생각하십시오.
quuxman 2016 년

@quuxman은 고마워요, 그때는 몰랐습니다. 혼란스러운 사람들을 피하기 위해 예전 의견을 삭제하겠습니다.
Timo Huovinen 2016 년

6

쉘을 심각하게 재구성하지 않으면 글 로빙 패턴 '*'이 '.'와 일치하지 않습니다. echo *를 사용하여 확인할 수 있으므로 또는 '..'. 대신 이름이 '.'로 시작하는 파일을 생략하면 숨겨진 파일이 모두 사라집니다. 쉘 옵션 (예 : bash의 dotglob 옵션)을 사용하여이 동작을 조정할 수 있지만 원하는 이식 가능하고 강력한 옵션은 아닙니다.

이 작업을 한두 번 이상 수행해야하는 경우 신중하게 제작 된 소스 및 대상 사양을 사용하여 rsync 또는 unison (특정 요구에 따라 다름)을 확인하는 것이 좋습니다.

또 다른 대안은 소스 디렉토리를 tarball에 넣고 기존 대상 디렉토리에서 untar하는 것입니다.


1
나는 이것을 사용한다 : ( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )... tar cf - .tar는 소스 디렉토리, 도트 파일을 포함하고 그것을 STDOUT에 뱉어 내고 ST의 STDIN으로 파이프된다 tar xf -.
quack quixote 0시 37 분

OP의 요점은 '.'으로 시작하는 파일을 참조하는 방법이라고 생각합니다. 하지만 없는 특별한 '.' 및 '..'디렉토리. rsync 또는 다른 복잡한 프로그램을 사용하는 대신 위의 훨씬 더 우아한 솔루션이 있습니다.
quuxman 2016 년

2

부모 디렉토리 ( ..) 를 제외하고 일반 파일과 숨겨진 파일을 모두 복사합니다 .

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

부모 디렉토리를 제외하지 않으면 ..대상 디렉토리 의 모든 내용으로 끝납니다 .


1
그러나 (예 : 또는 )로 시작하는 이름은 여전히 ​​제외합니다 . .......super-hidden
Scott

0

점으로 시작하는 파일을 복사하려면 cp. * target /

가장 쉬운 방법은 cp 명령을 두 번하는 것입니다.

피터 아이젠 트라우트 (Peter Eisentraut)는 일반적인 글 로빙 규칙에는 .. 및. (음,이 문장을 어떻게 끝 낼까?;)

-r을 사용하여 재귀를 만들고 -i를 사용하여 cp가 실제로 파일을 덮어 쓸 것인지 묻습니다.

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/

일반적으로 또는 *과 일치하지 않지만 사용하는 경우 에는 일치 합니다 . 시도하십시오 . 다음 패턴을 제외 하고 제외 할 수 있습니다 .. ....*echo .*....[^.]*
mch

@mch : 그러나 (예 : 또는 )로 시작하는.[^.]* 이름은 여전히 ​​제외합니다 . .......super-hidden
Scott

0

이것은 숨겨진 디렉토리를 제외한 모든 파일과 디렉토리를 현재 디렉토리에서 재귀 적으로 복사하는 데 효과적입니다.

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