숨겨진 파일을 재귀 적으로 복사-Linux


19

디렉토리의 모든 숨겨진 파일을 다른 디렉토리로 재귀 적으로 복사하는 쉬운 방법이 있습니까? 일반 파일이 아닌 홈 디렉토리의 모든 설정 파일 만 백업하고 싶습니다. 나는 시도했다 :

cp -R .* directory

숨겨지지 않은 모든 파일도 인식 .하고 ..재귀 적으로 복사합니다. 무시하는 CP 얻을 수있는 방법이 있나요 ...?


-r와 사이에 차이가 -R있습니까?
Chaminda Bandara

답변:


15

일반적으로 디렉토리를 옮기는 것을 좋아하는 것은 다음과 같습니다.

tar cvf - . | (cd /dest/dir; tar xvf -)

현재 디렉토리를 stdout으로 tar 한 다음 stdin을 untarring하기 전에 먼저 대상 디렉토리로 cd하는 서브 쉘로 파이프합니다. 간단하고 직접적이며 확장 가능-()를 다른 시스템의 ssh로 바꿀 때 발생하는 상황을 고려하십시오. 또는 귀하의 질문에 대답하기 위해 다음을 수행 할 수 있습니다.

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)

1
고마워, 제외 옵션은 내가 필요한 것입니다. 이미 다른 방법으로 수행했지만 나중에 참조 할 수 있도록 보관하겠습니다. 이것은 실제로 유연 해 보입니다 (아마도 느릴 수도 있습니다).
Zifre

1
좋은 조언. 몇 가지 개선 사항이 있습니다. 1) 사용 cd /dest/dir && tar xvf -. 은 &&당신이 목적지에 오타가있는 경우 소스 디렉토리를 통해 blatting에서 당신을 중지합니다. 2) vtar 명령 중 하나에 만 tar 플래그 가 필요합니다 .
Tom Shaw

그럴 수 있지. 또한 다른 방법으로 그룹화하는 것으로 알려져 있습니다. 원격 srcdir을 여기에 복사하려면 다음을 수행하십시오.(cd /src/dir && tar cf - .) | tar xvf -
pjz

17

거의 항상 다음과 같이 해결할 수 있습니다.

cp -R .[a-zA-Z0-9]* directory

이러한 문자 중 하나로 시작하지 않는 숨겨진 파일을 갖는 것은 매우 드문 일입니다.

다른 패턴 일치도 가능합니다 ( .??*, .[^.]*)-주석 참조


.-xyz 만 무시합니다. []의 내용은 점 다음의 첫 문자와 만 일치합니다.
Hamish Downer

6
. [^.] * 모든 것을 잡을 것입니다
falstro

1
... 두 마침표로 시작하는 것을 제외하고.
falstro 2016 년

@roe-그것도 좋은 버전입니다
Alnitak

@mish-그렇습니다. 나는 대답에서 많은 것을 말했습니다.
Alnitak

11

사용할 수 있습니다 rsync.

rsync -a ./ /some/other/directory/

현재 디렉토리의 내용을 복사합니다 (점 파일은 포함하지만 제외 ..)


간단하고 숨겨진 폴더의 숨겨진 파일에서도 작동합니다.
user59183

나를 위해 이것은 제공되는 솔루션 중 덜 혼란스럽고 가장 효과적입니다
palerdot

좋은 해결책. 또한 여러 .git디렉토리에 복사하지 않기 위해 필요했습니다 . -C를 추가하면 이렇게되므로 명령이 다음과 같이됩니다.rsync -aC ./ /some/other/directory/
theruss

10

난 당신을 간청 멀리에 일반 쉘 확장의 단계 cp커맨드 라인 - 쉘 확장이 모든 종류가 에헴 .에 의한 "흥미로운"코너 케이스 (원치 않는 재귀를하고 .., 공백, 인쇄 할 수없는 물건, 하드 링크, 심볼릭 링크, find대신 사용하십시오. findutils패키지가 설치되어 있지 않은 경우 패키지로 제공됩니다. 이상하게도 모든 배포판에서 기본적으로 설치됩니다.

find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;

단계별 설명 :

  • -H원인이됩니다 find심볼릭 링크를 따라하지 (당신이 그것을 준 실제 최상위 디렉토리 이름이 심볼릭 링크 인 경우를 제외하고,.이 따를 것입니다)
  • /path/to/toplevel/dir/ 분명히, 설정 파일과 백업하려는 디렉토리를 호스팅하는 디렉토리를 수행하는 경로로 대체해야합니다.
  • -maxdepth 1find이름이 점으로 시작하는 디렉토리로 재귀 적으로 내림차순 정지 합니다. 우리는 재귀에 필요하지 않습니다. 우리 cp를 위해 그렇게 할 것입니다. 우리는이 레벨의 이름 만 있으면됩니다.
  • -name '.*'find점으로 시작하는 모든 이름을 원한다는 것을 알려줍니다 . 환경 변수 POSIXLY_CORRECT가 설정 되어 있으면 올바르게 작동 하지 않지만 거의 그렇지 않습니다. 이것은 우리가 지금까지 지정한 첫 번째 일치 조건입니다.
  • a \( ....... \)됩니다 괄호 안에 더 복잡한 조건에 의해 다음 (내가 사용했습니다 ..... 그것을 대체, 그것의 아래에 설명했다.) 그들은 그렇지 않으면 쉘에 의해 해석 (잘못)이 될 것이기 때문에 우리는 괄호를 탈출해야합니다, 따라서 백 슬래시 앞에
  • -type d -o -type f -o -type l그들 사이 또는 사이에 세 가지 조건이 있습니다. -type d디렉토리와 -type f일치하고 일반 파일과 -type l일치하고 심볼릭 링크 와 일치합니다. 당신은 당신이 원하는 것을 선택할 수 있습니다 - 당신은 백업 설정 디렉토리, 생략하지 않을 경우, 예를 들어 -type d(그리고 -o. 그 뒤에 바로 분명히)
  • -exec ..... \;find일치 할 때마다 명령을 실행하도록 지시 합니다. 명령의 끝은 세미콜론으로 표시되며, 쉘 해석을 피하기 위해 다시 백 슬래시로 이스케이프해야합니다. 해당 명령 줄 내 {}에서 현재 발견 된 일치 이름을 끝내려는 위치 를 사용해야 합니다. 쉘도 중괄호를 잘못 해석 할 수 있으므로에서와 같이 아포스트로피에 배치해야합니다 '{}'. 이 경우에 실행하려는 명령은 다음과 같습니다 cp -a '{}' /path/to/destination/dir/(-아카이브는 하위 디렉토리에서 재귀하고 심볼릭 링크를 링크로 복사하며 권한 및 확장 된 속성을 보존 /path/to/destination/dir/하며 대상 디렉토리의 이름 인 것을 의미합니다).

따라서이 find명령 줄은 일반 영어로 다음과 같이 말합니다.

/ path / to / toplevel / dir /에서 시작하십시오. 하위 디렉토리로 내려 가지 마십시오. 이름이 점으로 시작하는 모든 디렉토리, 파일 및 심볼릭 링크를 찾으십시오. 찾은 각 항목에 대해 / path / to / destination / dir / 특성, 권한 및 확장 된 속성을 보존하여 복사하십시오.


1
찾기가 가장 유용한 것입니다.
Mr. Shiny and New 安 宇

1
좋은 대답입니다. 나는 -exec를 선호하지만 ... ';' 백 슬래시를 피한다는 것은이 명령이 CLI와 crontab에서 모두 작동한다는 것을 의미합니다. :))
kubanczyk 2016 년

8

나는 항상 "."를 얻지 않고 숨겨진 파일을 찾기 위해. ?? *를 사용했습니다. 그리고 "..". ".a"나 다른 것을 놓칠 수도 있지만 나는 그중 하나가 없습니다.


확실히 좋고 깔끔한 :) +1
falstro

".a"가 있으면 신비하게 실패하고 싶지 않습니다
Zifre

단일 문자 숨김 파일이 없다는 것을 알고 있으면 실제로 입력하는 것이 빠르기 때문에 마음에 듭니다.
Paul Tomblin

이것이 가장 좋은 대답이어야합니다. 상단으로 올라 가야합니다.
Ibn Saeed

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