답변:
일반적으로 디렉토리를 옮기는 것을 좋아하는 것은 다음과 같습니다.
tar cvf - . | (cd /dest/dir; tar xvf -)
현재 디렉토리를 stdout으로 tar 한 다음 stdin을 untarring하기 전에 먼저 대상 디렉토리로 cd하는 서브 쉘로 파이프합니다. 간단하고 직접적이며 확장 가능-()를 다른 시스템의 ssh로 바꿀 때 발생하는 상황을 고려하십시오. 또는 귀하의 질문에 대답하기 위해 다음을 수행 할 수 있습니다.
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
cd /dest/dir && tar xvf -
. 은 &&
당신이 목적지에 오타가있는 경우 소스 디렉토리를 통해 blatting에서 당신을 중지합니다. 2) v
tar 명령 중 하나에 만 tar 플래그 가 필요합니다 .
(cd /src/dir && tar cf - .) | tar xvf -
거의 항상 다음과 같이 해결할 수 있습니다.
cp -R .[a-zA-Z0-9]* directory
이러한 문자 중 하나로 시작하지 않는 숨겨진 파일을 갖는 것은 매우 드문 일입니다.
다른 패턴 일치도 가능합니다 ( .??*
, .[^.]*
)-주석 참조
사용할 수 있습니다 rsync
.
rsync -a ./ /some/other/directory/
현재 디렉토리의 내용을 복사합니다 (점 파일은 포함하지만 제외 ..
)
.git
디렉토리에 복사하지 않기 위해 필요했습니다 . -C를 추가하면 이렇게되므로 명령이 다음과 같이됩니다.rsync -aC ./ /some/other/directory/
난 당신을 간청 멀리에 일반 쉘 확장의 단계 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 1
find
이름이 점으로 시작하는 디렉토리로 재귀 적으로 내림차순 정지 합니다. 우리는 재귀에 필요하지 않습니다. 우리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 / 특성, 권한 및 확장 된 속성을 보존하여 복사하십시오.
여기에 훨씬 더 나은 답변; /superuser/61611/how-to-copy-with-cp-to-include-hidden-files-and-hidden-directories-and-their-con
예를 들어 네이티브 bash 솔루션에 shopt 사용
-r
와 사이에 차이가-R
있습니까?