glob 패턴을 사용한 cp 숨김 파일

glob 패턴을 사용한 cp 숨김 파일

상태:

$ mkdir foo && touch foo/.test
$ cp foo/* .
zsh: no matches found: foo/*
(or bash : cp: cannot stat ‘foo/*’: No such file or directory)

숨겨진 폴더와 파일로 가득 찬 디렉토리가 있습니다. 무슨 일이 일어났으며 해결책은 무엇입니까?

답변1

의 경우 zsh일반적인 접근 방식은 다음을 사용하는 것입니다.D 글로벌 예선([D]ot 파일 포함):

cp foo/*(D) .

Dzsh glob에는 ( 예상대로) 포함되거나 포함되지 .않습니다 ...

답변2

면책 조항: 이 답변은 Bash에만 해당되지만 대부분은 전역 모드에 대한 질문에 적용됩니다!

별표( *)는 와일드카드 문자입니다. 일부 특정 문자 세트를 대체하며 점( .)인 첫 번째 문자는 그 중 하나가 아닙니다. 이것은 Unix 파일 시스템이 작동하는 방식 때문에 특별한 경우입니다. 점으로 시작하는 파일은 "숨겨진" 것으로 간주됩니다. 즉, 등의 도구는 명시적으로 지시하지 않는 한 해당 항목을 "보지" cp않습니다 .ls

먼저 몇 가지 샘플 데이터를 만들어 보겠습니다.

$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}

이제 우리는 다음을 갖습니다:

$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3

이제 몇 가지 게임을 해보자. 이 명령을 사용하면 다음과 같이 특정 명령에 대한 특정 와일드카드( )를 echo나열 할 수 있습니다.*

$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3


$ echo reg*
regdir1 regdir2 regfile1 regfile2 regfile3

$ echo .*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2

$ echo .* *
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3

$ echo .dotdir*
.dotdir1 .dotdir2

행동을 바꾸시겠습니까?

이 명령을 사용하면 유사한 파일 외에도 일치 하도록 shopt -s dotglob동작을 변경할 수 있습니다 .*regfile1.dotfile1

bash매뉴얼 페이지에서 발췌

dotglob If set, bash includes filenames beginning with a `.' in the results 
        of pathname expansion.

예:

$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3

다음 명령을 사용하여 이 동작을 복원할 수 있습니다.

$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3

당신의 상황은?

귀하의 경우, cp패턴과 일치하는 모든 파일을 복사하고 싶지만 *아무것도 복사하고 싶지 않다고 말씀하셨습니다.

$ cp foo/.* .

또는 폴더의 모든 내용을 원하는 경우 다음을 수행할 수 있습니다 foo.

$ cp foo .

또는 명시적으로 다음과 같이 말할 수도 있습니다.

$ cp foot/.* foo/* .

중괄호 확장을 사용하는 보다 간결한 형식 bash:

$ cp foo/{.,}* .

언제든지 이 echo트릭을 사용하여 제안된 파일 모드를 볼 수 있습니다(별표가 속한 부분을 가리키는 멋진 용어입니다).

$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3

그런데, 파일 디렉터리와 다른 디렉터리를 복사하려면 일반적으로 재귀적으로 수행하고 싶습니다. 즉, 다음 -R으로 전환합니다 cp.

$ cp -R foo/. .

답변3

쉘은 문자를 구문 분석할 때 이러한 파일을 숨겨진 파일로 처리하므로 *이러한 cp파일 이름을 인수로 수신하지 않습니다.

명시적으로 지정하여 복사할 수 있습니다.cp foo/.* .

답변4

모든 파일과 디렉터리를 한 위치에서 다른 위치로 복사하려는 경우 표준 rsync명령을 사용할 수 있습니다. 위에서 제시한 예에서는 다음과 같습니다.

mkdir foo && touch foo/.test
rsync -a foo/ .

foo숨겨진 파일과 숨겨진 디렉터리를 포함한 모든 것을 현재 디렉터리에 재귀적으로 복사합니다 . 후행 슬래시는 foo/rsync에 중요합니다. 이를 사용하면 foo슬래시 없이 rsync가 복사할 내용만 복사 됩니다 foo. 예를 들어:-

mkdir src && mkdir dest && touch src/.test
rsync -a src  dest    // copies 'src' contents to 'dest/src'
rsync -a src/ dest    // copies 'src' contents to 'dest' 

시스템 간 복사를 포함하여 rsync를 조정하는 다른 많은 옵션이 있습니다.

관련 정보