상태:
$ 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) .
D
zsh 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를 조정하는 다른 많은 옵션이 있습니다.