우리 팀의 누군가가 사용자의 홈 디렉터리에 있는 모든 숨겨진 디렉터리에 대한 사용자 권한을 반복적으로 변경하려고 합니다. 이를 위해 그는 다음 명령을 실행했습니다.
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 ksh
등 yash
)에 (t)csh 및 와 마찬가지로 이를 포함합니다. 심지어 물고기1. 일부 쉘은 모든 와일드카드 일치에서 제외됩니다 .
: ..
zsh, pdksh/posh/mksh(AT&T ksh와 다름), fish≥2.0.
GLOBIGNORE
null이 아닌 값으로 설정된 경우세게 때리다일치에서 .
합계를 제외하는 편리하지만 비표준 동작 으로 전환합니다. ..
이 설정은 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
( -maxdepth
POSIX가 아닌 확장이지만 Linux에서는 쉽게 작동합니다) 사용을 고려하십시오 .
find . -maxdepth 1 -type d -name '.*' -exec chown -R user:group {} +