`command.*`는 상위 디렉토리에서 작동합니다.

`command.*`는 상위 디렉토리에서 작동합니다.

우리 팀의 누군가가 사용자의 홈 디렉터리에 있는 모든 숨겨진 디렉터리에 대한 사용자 권한을 반복적으로 변경하려고 합니다. 이를 위해 그는 다음 명령을 실행했습니다.

cd /home/username
chown -R username:groupname .*

우리는 그가 실제로 /home에 있는 모든 사용자 디렉터리의 권한을 반복적으로 변경했다는 사실을 알고 매우 놀랐습니다. 왜냐하면 역시 .*동일하기 때문입니다. ..Linux에서 이러한 동작을 예상하셨나요?

답변1

.*를 사용하여 무엇이든 하려고 하면 항상 화상을 입었고 오래 전에 문자 클래스를 사용하도록 전환했습니다.

chown -R username.groupname .[A-Za-z]*

그게 내가 할 일이다.

편집: 누군가가 예를 들어 도트 파일을 얻을 수 없다고 지적했습니다 ._Library. 예를 들어 사용할 모든 문자 클래스를 캡처하는 것은 다음과 같습니다.

chown -R username.groupname .[A-Za-z0-9_-]*

답변2

확장된 와일드카드( shopt -s extglob)를 사용하여 다음을 사용할 수 있습니다.

.!(.|)

즉, 점이 없거나 점 뒤에 아무것도 없습니다.

답변3

.해당 문자는 파일 이름의 첫 번째 문자이고 와일드카드와 일치하는 경우에만 와일드카드 일치에서 제외됩니다 . 패턴에서 .*는 로 시작하여 포함 *하는 문자열과 일치합니다 (뿐만 아니라 는 빈 문자열과 일치함). 이는 짜증나는 패턴 일치 규칙의 직접적인 결과입니다...*...*

.예외를 만들고 일치 항목에서 및 를 체계적으로 제외하는 것이 합리적 ..이지만 역사적으로 수행된 방식은 아닙니다. 많은 Bourne/POSIX 셸( sh, dash, bash, AT&T kshyash)에 (t)csh 및 와 마찬가지로 이를 포함합니다. 심지어 물고기1. 일부 쉘은 모든 와일드카드 일치에서 제외됩니다 .: ..zsh, pdksh/posh/mksh(AT&T ksh와 다름), fish≥2.0.

GLOBIGNOREnull이 아닌 값으로 설정된 경우세게 때리다일치에서 .합계를 제외하는 편리하지만 비표준 동작 으로 전환합니다. ..이 설정은 GLOBIGNORE또한 점 파일 제외 동작을 끕니다. 를 사용하면 GLOBIGNORE='.*'점 파일을 제외하는 일반적인 동작을 얻을 수 있지만 OR이 아닌 점 파일과만 일치합니다. (or)를 설정하면 도트 파일을 포함하여 모든 파일과 일치하지만 및는 제외됩니다../*./.*...GLOBIGNORE=.:..GLOBIGNORE=../*...

ksh93에서는 FIGNORE='@(.|..)'일치하는 파일에서 도트 파일을 제외 .하고 포함하도록 설정합니다. ..따라서 .*도트 파일로 확장되지만 .또는 ...

쉘 특정 기능을 사용하지 않고도 다음 두 개의 glob을 사용하여 도트 파일을 일치시킬 수 있습니다.

.[!.]* ..?*

.그리고 다음 세 개의 글로브가 있는 모든 파일(및 제외 ):..

..?* .[!.]* *

그러나 하나 이상의 glob이 어떤 파일과도 일치하지 않을 수 있으므로 주의해야 합니다. 이로 인해 해당 패턴이 확장되지 않은 상태로 유지됩니다.

놀라움을 피하려면 를 사용하는 것이 더 쉬울 수도 있습니다 find. find(심볼릭 링크를 따르라는 지시가 없는 한) 절대 상위 디렉토리로 재귀하지 마십시오.

find /home/username/. -name . -o -prune -name '.*' -exec chown -R username:groupname {} +

답변4

find( -maxdepthPOSIX가 아닌 확장이지만 Linux에서는 쉽게 작동합니다) 사용을 고려하십시오 .

find . -maxdepth 1 -type d -name '.*' -exec chown -R user:group {} +

관련 정보