숨겨진 파일을 재귀 적으로 복사-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.