숨겨진 파일과 숨겨진 디렉토리 및 내용을 포함하기 위해 cp로 복사하는 방법은 무엇입니까?


392

디렉토리의 모든 파일과 디렉토리를 완전히cp -r 복사 하는 방법

요구 사항 :

  • 숨겨진 파일과 숨겨진 디렉토리를 포함하십시오.
  • 위의 플래그를 포함하는 단일 명령이어야합니다.
  • 패턴 일치에 전혀 의존 할 필요는 없습니다.

내 추악하지만 작동하는 해킹은 다음과 같습니다.

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

패턴 일치없이 하나의 명령으로 어떻게이 작업을 수행 할 수 있습니까? 어떤 플래그를 사용해야합니까?


1
여기에 더 많은 답변이 있지만 좋지 않은 것처럼 보입니다. serverfault.com/questions/3154/…
Roel Van de Paar

Eleven81은 새 폴더를 만들지 않기 때문에 @bruno pereira가 제공 한 답변으로 변경을 고려하십시오. 그렇지 않은 경우,이 의견은 다른 독자들 (가장 많은 투표)의 답변을 확인하기 위해 새로운 독자들에게 경고가되게하십시오. Tx.
Dr Beco

답변:


265

파일을 지정하지 마십시오 :

cp -r /etc/skel /home/user

( /home/user이미 존재하지 않아야합니다 /home/user/skel. 그렇지 않으면 생성 됩니다.)


61
이 경우 유사한 것을 사용하는 것이 가능 /home/user/skel 않는 존재 하는가?
bradley.ayers 오전

@ bradley.ayers 같은 하위 드라이브로 이동하는 것이 빠르기 때문에 임시 하위 디렉토리에 복사 한 다음 상위 레벨로 이동할 수 있다고 생각합니다. 이상적이지는 않지만 다른 솔루션보다 짧습니다.
Halil Özgür

7
@ bradley.ayers Bruno의 답변은 아래에서 귀하의 질문을 해결합니다
Mark

1
이 솔루션은 저에게 효과적이지 않았습니다. 숨겨진 파일은 복사하지 않았습니다. CentOS 릴리스 6.5를 사용하고 있습니다. @Bruno의 솔루션이 트릭을 수행했습니다.
Technext

2
우분투 / 데비안에서는 skel 내부의 재귀 파일이 아닌 대상 디렉토리 안에 'skel'디렉토리를 배치합니다. 사용 -T올바른 사용법 (어떤 대상) 아래 당합니다. ( -rT순환 용)
bshea

468

새 폴더를 만들거나 폴더를 만든 후 폴더를 만든 후 파일을 복사하려고한다고 가정합니다.

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

이렇게하면 모든 파일 / 폴더 /etc/skel가 첫 번째 줄에서 생성 된 기존 폴더로 재귀 적으로 복사 됩니다.


5
내가 잘못하지 않으면 숨겨진 / 점 파일이 복사되지 않았습니다.
Halil Özgür

34
나를 위해 잘 작동합니다. '.' 작동하는 데 중요합니다.
Mark

12
작동하지만 왜 그렇습니까? 매뉴얼에서 이에 대한 참조를 찾을 수 없습니다.
Julien Palard

5
정상적으로 작동하기 때문에 첫 번째 인수에서 마지막 폴더의 이름으로 새 폴더를 생성하기 때문에 작동한다고 생각합니다. 그러나 해당 이름은 .이므로이 동작을 수행하려면 이미 존재하는 디렉토리를 작성해야하므로 해당 단계를 건너 뜁니다.
Zenexer 2016 년

28
@Technext bash의 기본 globbing에는 파일 을 포함하기 전에 명령 .을 사용해야하는 파일 이름을 포함하지 않습니다 shopt -s dotglob. 따라서 *기본적으로을 사용하여 확장 할 수있는이 디렉토리에서 모든 파일을 재귀 적으로 복사하도록 요청합니다 *(기본적으로 숨겨진 파일은 포함되지 않음). 다른 한편으로는 .cp를 사용하여 "this directory"에서 모든 것을 재귀 적으로 복사합니다.
Bruno Pereira 2019

79

이 작업을 수행하는 올바른 방법은 -T (--no-target-directory)옵션 을 사용하고 슬래시, 별표 등이없는 폴더를 재귀 적으로 복사하는 것입니다.

cp -rT /etc/skel /home/user

이 내용 복사합니다 /etc/skel/home/user폴더를 생성, (숨겨진 파일 포함) /home/user가 존재하지 않는 경우를; 그러나이 -T옵션을 사용하면 폴더 가 존재 하는 경우 내용이 /etc/skel새 폴더로 복사되지 않습니다./home/user/skel/home/user


3
정답. +1
bshea

이것은 실제로 정답이었습니다
Gaetan

이것이 무리의 가장 좋은 대답입니다. 그것을 복잡하게하지 않고 문제를 해결의 유일한
ZaxLofful

정확히 예상대로 복사
Chetabahana

한 경우에 올바른 cmd 플래그를 사용할 때 좋아하십시오.
Tran Triet

66

bash자체 그것이을 가지고, 좋은 솔루션을 제공 shell option할 수있는, cp, mv등 :

shopt -s dotglob # for considering dot files (turn on dot files)

shopt -u dotglob # for don't considering dot files (turn off dot files)

위의 솔루션은 표준입니다 bash

노트:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

2
대상 내에 새 디렉토리를 만들지 않고 내용 만 복사하려는 경우에 유용합니다. 특히 대상 디렉토리가 마운트 지점 인 경우.
kaszynek

3
이것은 정말 최고의 답변이며 질문의 핵심에 도달합니다.
Stephen

7
그것은의 setopt경우 다른 사람이 궁금해에, zsh을 위해.
Pat

25

rsync를 사용하십시오.

rsync -rtv source_folder/ destination_folder/


--progress를 사용하여 전체 프로세스에 대해 더 많은 피드백을 제공하지만 최선의 선택입니다.
에덴 쇼

5

rsync 좋지만 다른 선택입니다.

cp -a src/ dst/

기본 도움말에서 :

   -a, --archive
          same as -dR --preserve=all

   -d     same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively

나는 항상 cp -r을 사용했다. cp -a를 언급 해 주셔서 감사합니다
Pinaki Mukherjee

4

소스 및 대상 디렉토리의 이름이 동일한 경우 대상 디렉토리가 있어도 다음을 입력하면됩니다.

cp -R /etc/skel /home/

숨겨진 파일과 디렉토리를 포함하여 / etc / skel 디렉토리를 / home /에 복사합니다.

결국 디렉토리를 복사하고 한 줄로 이름을 바꿀 수 있습니다.

cp -R /etc/skel /home/ && mv /home/skel /home/user

또는 단순히 cp -r /etc/skel /home/user이름 skel을 바꾸는 데 사용할 수도 있습니다 user.
David

/ home / user가 아직없는 경우에만 그렇습니다.
Gabriel Hautclocq

4

rsync를 사용할 수 있습니다.

rsync -aP ./from/dir/ /some/other/directory/

ssh를 통해 복사 할 수도 있습니다.

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/

사용할 수있는 다양한 플래그가 있습니다 : -a, --archive # archive (-rlptgoD)

-r, --recursive
-l, --links      # copy symlinks as links
-p, --perms      # preserve permissions
-t, --times      # preserve times
-g, --group      # preserve group
-o, --owner      # preserve owner
-D               # --devices --specials

--delete         # Delete extra files

You may want to add the -P option to your command.

--partial        # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.

-P               # The -P option is equivalent to --partial --progress.   Its  purpose  is to make it much easier to specify these two options for a long transfer that may be interrupted.

Rsync 매뉴얼 페이지


4

가장 간단한 방법은 다음과 같습니다.

cp -r /etc/skel/{.,}* /home/user

이 표현식 {.,}*에는 모든 파일과 디렉토리가 포함됩니다 (점으로 시작).

위의 표현식을 사용하지 않으려면 cp하나의 대상 폴더에 여러 소스를 지정할 수 있는 속성을 사용할 수 있습니다 .

cp -r /etc/skel/* /etc/skel/.* /home/user

1
이 같은 파일을 놓칠 ..anything또는 ...anything등 - stackoverflow.com/a/31438355/2351568은 이 문제에 대한 올바른 정규식이 포함되어 있습니다. || 그러나 어쨌든 사용하는 shopt -s dotglob것이 여전히 더 나은 솔루션입니다!
DJCrashdummy

@DJCrashdummy 불행히도, 나는 당신이 관심을 쓴 이유를 이해하지 못합니다. 결국, 내 솔루션은 당신이 쓴 사례를 고려합니다. 안부
simhumileco

미안 잘못된 텍스트! - 답변의 문제는 아니라 생각 것입니다 ...(현재 및 포함 된 폴더에 해당한다). || 그러나 여전히 링크대답은 더 자세히 설명하고 해결책을 제공합니다.
DJCrashdummy

2

명령 줄 트릭이 있습니다 (적어도 sh , bashksh에서 작동 ). 슬래시로 from 디렉토리에 접미사를 붙이십시오. 이것은 from 디렉토리 의 내용을 to 디렉토리로 쏟아 부을 것입니다 (아이 론적으로 rsync를 사용할 때이 트릭에 대해 처음 알게되었습니다 ).

예:

/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2

/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa

/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa

2

나는 같은 문제에 대한 해결책을 찾기 위해 Googled를 가지고 왔으며 찾기로 쉽게 할 수 있음을 깨달았습니다. 쉘이나 설치되지 않은 특수 유틸리티에 의존하지 않는 장점.

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

슬래시로 트릭을 시도했지만 그게 효과가 없었습니다.


2

권한을 유지 하는 대상 디렉토리에 모든 파일 ( .파일 포함 )을 복사 해야 할 때이 문제에 대한 해결책 은 다음과 같습니다. (이미 존재하는 경우 덮어 쓰기)

yes | cp -rvp /source/directory /destination/directory/

yes대상 파일을 자동으로 덮어 쓰고, r재귀 적이며, v상세하게, p권한을 유지하기위한 것입니다.

것을 알 소스 경로가 끝나는되지 않은/ (그래서 모든 파일 / 디렉토리. 파일이 복사됩니다)

대상 디렉토리는/ 소스 폴더의 내용을 대상 전체에 배치함에 따라 끝납니다 .


1

cp가 항상 숨겨진 파일을 복사하는 것은 아니며 모든 Linux / 유닉스 방언에서 작동하는 명령을 원한다면 다음을 사용하십시오.

cd /etc/skel
find | cpio -pdumv /home/user

-2

최소한 K3b 2.0.3부터는 디렉토리를 프로젝트에 추가 할 때 팝업 상자가 표시되며 숨겨진 파일을 포함시킬 것인지 묻는 질문이 있습니다 ... 연결. 좋은 물건!


쉘 (CLI) 명령의 경우 "팝업 상자"가 표시됩니까?
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.