it-swarm-ko.tech

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

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

cp -R .* directory

그러나 ...를 인식하고 숨겨지지 않은 모든 파일도 재귀 적으로 복사합니다. cp가 ...를 무시하도록하는 방법이 있습니까?

19
Zifre

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

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

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

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

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

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

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

다른 패턴 일치도 가능합니다 (.??*, .[^.]*)-의견보기

19
Alnitak

rsync를 사용할 수 있습니다.

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

현재 디렉토리의 내용을 복사합니다 (도트 파일은 포함하지만 ..은 포함하지 않음)

11
Rory

cp 명령 줄에서 일반 Shell 확장에서 벗어나 쉘 확장-모든 종류의 ahem "흥미로운"코너 사례 (. 및 .., 공백, 인쇄 할 수없는 항목, 하드 링크, 심볼릭 링크 등으로 인한 원하지 않는 재귀) 대신 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/ \;

단계별 설명 :

  • -Hfind가 심볼릭 링크를 따르지 않도록합니다 (실제로 최상위 디렉토리 이름이 심볼릭 링크 인 경우 제외).
  • /path/to/toplevel/dir/은 분명히 설정 파일과 디렉토리를 호스팅하는 디렉토리를 경로로 바꾸어야합니다. 백업.
  • -maxdepth 1find가 점으로 시작하는 디렉토리로 재귀 적으로 내려가는 것을 막습니다. cp는 우리를 위해 그렇게 할 것이므로이 수준의 이름 만 있으면됩니다.
  • -name '.*'find에 점으로 시작하는 모든 이름을 원한다고 알려줍니다. 환경 변수 POSIXLY_CORRECT가 설정되어 있으면 제대로 작동하지 않지만 거의 설정되지 않습니다. 이것은 우리가 지금까지 지정한 첫 번째 일치 조건입니다.
  • a \( ....... \)and 다음에 괄호 안에 더 복잡한 조건이옵니다. (.....을 사용하여 대체했습니다. 아래 설명되어 있습니다.) 괄호를 이스케이프 처리해야합니다. 쉘에 의해 (미스) 해석되기 때문에 백 슬래시 앞에
  • -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/특성, 권한 및 확장 된 속성을 보존하여 복사하십시오.

10
Mihai Limbăşan

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

8
Paul Tomblin

여기에 훨씬 더 나은 답변; https://superuser.com/questions/61611/how-to-copy-with-cp-to-include-hidden-files-and-hidden-directories-and-their-con

예를 들어 네이티브 bash 솔루션에 shopt 사용

0
Roel Van de Paar