ZSH Globbing 구문 설명

ZSH Globbing 구문 설명

폴더 dotfiles의 모든 내용을 ~git 저장소에 복사하여 백업하고 싶은데 ZSH.

작동하는 것 같은 다음 명령을 찾았습니다.

cp -a ~/.[^.]* .결승전은 어디입니까? git 디렉토리입니다.

나는 이것이 어떻게 작동하는지 이해하지 못합니다. 누구든지 나에게 가이드를 주거나 자세한 내용을 알아보려면 Google에 무엇을 검색해야 하는지 말해 줄 수 있습니까?

나는 노력했다ZSH + [^] + globbing

답변1

이 구문은 일부 쉘에서 작동합니다.다른거기 에서도 zsh그것은 잘못된 것입니다.

.[^.]*문자 이외의 0개 이상의 문자가 뒤에 오는 .파일 이름 과 일치합니다..

.이는 및 ..확장을 포함하는 셸에 필요한 구문 입니다 .*.

...현재 디렉터리와 상위 디렉터리를 각각 참조하기 위한 탐색 도구입니다 . glob은 실제 파일 목록을 생성하는 도구이므로 glob 확장에는 사용할 수 없습니다. 그럼에도 불구하고 역사적으로 쉘은 보고된 대로 글로벌 확장에 이를 포함했습니다 readdir().

zsh, Forsyth 쉘 및 그 하위 항목(pdksh, mksh, OpenBSD sh...) 또는 fish쉘이 문제를 해결했으며 결과에 .Nor를 포함 하지 않습니다...파일 이름 생성², 다음과 같은 전역 변수의 경우에도:

$ echo (.|..)
zsh: no matches found: (.|..)

와 같은 것을 잃기 때문에 일반적인 경우에도 잘못된 것입니다 ..foobar.

또한 [^.]많은 쉘이 이를 지원하지만 표준 POSIX 구문은 아닙니다.

POSIX sh구문에는 다음이 필요합니다.

cp -a ~/.[!.]* ~/..?* .

..?*( 일치하는 항목을 추가한 ..다음하나위의 파일 이름 유형을 포함하는 문자 수 이상 ..foobar).

zsh(및 위에서 언급한 다른 쉘) 에는 다음이 필요합니다.

cp -a ~/.* .

희망,결국 POSIX에서 sh에 대해 허용/권장됩니다.우리는 더 많은 다른 껍질이 뒤따르는 것을 보게 될 것입니다.


1 역사적 기록과 전설에 따르면 .이름이 다음과 같이 시작하는 파일의 개념은 다음과 같습니다.숨겨진1970년대 이 유틸리티 초기 버전의 버그로 인해 발생했으며 이로 인해 ls모든 파일 이름이 . 이 버그는 사람들이 파일을 숨기기 위해 이 버그에 의존하기 시작하면서 기능이 되었습니다.....

² Bash는 globskipdots버전 5.2에서 옵션을 추가했습니다.

답변2

부분으로 나누어 보겠습니다.

  • cp -a: 모든 내용 ~/.[^.]*과 그 아래의 디렉터리를 "하위 디렉터리도 복사하고 파일과 디렉터리의 모든 속성을 동일하게 유지하십시오"라고 말한 위치에 복사합니다 .
    . -a추가 man cp정보
  • ~/.[^.]*: 다음과 같은 이유로 홈 디렉터리에 있는 모든 숨겨진 파일과 디렉터리:
    • ~당신의 홈 디렉토리는 무엇입니까?
    • *"이것은 무엇이든 될 수 있다"는 뜻이므로 ~/*다음과 같습니다: 홈 디렉터리의 모든 파일/디렉터리
    • ~/.*다음과 같습니다. 홈 디렉터리에서 점으로 시작하는 모든 파일입니다. 언뜻 보기에 이것은 "모든 숨겨진 파일 및 디렉터리"와 동일해 보이지만 디렉터리 .(현재 디렉터리) 및 ..(상위 디렉터리) 도 있고 원하지 않기 때문에 그렇지 않습니다.
    • [^.]"the를 제외한 모든 가능한 문자를 의미하므로 .and"의 문제가 해결됩니다....

따라서 전체적으로 이 명령은 다음을 의미합니다. 홈 디렉터리의 모든 숨겨진 파일과 디렉터리를 현재 디렉터리로 복사합니다.

관련 정보