폴더 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"의 문제가 해결됩니다..
..
따라서 전체적으로 이 명령은 다음을 의미합니다. 홈 디렉터리의 모든 숨겨진 파일과 디렉터리를 현재 디렉터리로 복사합니다.