chown 작업을 재귀 적으로 수행하려면 어떻게해야합니까?


285

pdfs하위 및 하위 하위 디렉토리 를 포함하는 디렉토리가 있습니다. 모든 하위 폴더의 모든 PDF 파일에 대한 소유권을 변경하고 싶습니다. 방금 이것을 시도했습니다.

chown -R someuser:somegroup *.pdf

...하지만 하위 디렉토리의 PDF 소유권은 변경하지 않았습니다. 사용자와 그룹이 존재합니다.

에 대한 매뉴얼 페이지에 따르면 chown, -R재귀를 의미해야합니다.

-R, --recursive
          operate on files and directories recursively

내가 무엇을 놓치고 있습니까?

답변:


291

재귀 모드는 파일이 아닌 디렉토리에서만 작동합니다. 글로브 '* .pdf'를 사용하여 쉘은 파일 목록을 chown으로 전달합니다. 파일 목록을보고 파일에 대한 사용 권한을 변경하면됩니다.

쉘에서 glob는 명령이 아니라 쉘에 의해 평가된다는 것을 기억하십시오. glob이 파일과 일치하면 해당 glob이 명령으로 전달되고 명령은 glob가 존재한다는 것을 절대 알 수 없습니다. (이것은 Windows 명령 프롬프트가 작업을 수행하는 방법과 다릅니다). 디렉토리가있는 경우 내용은 다음과 같습니다.

machine:$ ls -F
file1.pdf  file2.pdf  other.txt  subdir/

그리고 당신은 입력 :

chown -R someuser:somegroup *.pdf

쉘은 먼저리스트를 만듭니다 : file1.pdf file2.pdf

그런 다음 명령을 실행하십시오.

chown -R someuser:somegroup file1.pdf file2.pdf

-R에 대한 디렉토리가 없습니다.를 참조하십시오. 명령 행에서 두 파일의 소유권을 변경하고 기발한 -R 플래그를 무시하고 요청한 내용을 수행합니다.

'* .pdf'를이 디렉토리 및 서브 디렉토리의 패턴으로 사용하려면 find파일 이름 패턴 (또는 다른 많은 크리 테리아)과 일치하는 파일을 찾아서 부속 명령에 전달할 수 있습니다.

find . -type f -name '*.pdf' | xargs chown someuser:somegroup

이것은 현재 디렉토리 '.'에서 시작합니다. 이름 패턴의 파일 (파일 유형 f)을 '*.pdf'찾은 다음 xargs로 전달하여 chmod에 대한 명령 행을 구성합니다. 패턴 주위의 따옴표를 주목하십시오 '*.pdf'. 쉘은 가능하다면 글로브를 생성하지만 패턴을 전달하기 find를 원하므로 인용해야합니다.

파일 이름에 공백이있을 수 있으므로 트릭을 사용하여 파일 이름을 공백없이 안전하게 만들려고합니다.

find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup

bash 3 이하에서는 이것이 필요한 방법입니다. bash 4 (와 shopt -s globstar) 및 기타 쉘 에서 더 강력한 글 러빙을 사용할 수 있습니다 . 재귀 glob을 사용하는 zsh에서도 동일합니다 **.

chown -R someuser:somegroup ./**/*.pdf

1
bash 4 shopt -s globstar가 재귀 globbing 을 수행 하도록 반영하도록 편집되었습니다 .
kojiro

@kojiro 감사합니다! bash3를 사용한다고 말할 수 있듯이
Rich Homolka

2
원래 포스터에 표시된 매뉴얼 페이지에 따르면 chown -R이 실제로 폴더와 파일의 소유자를 변경 한 것으로 나타났습니다. 찾을 필요가 없습니다. 민트 15 사용.
gwideman

@gwideman 나는 이것이 오래되었다는 것을 알고있다. 그렇다. 물론 -R은 재귀 적이다. OP는 방금 매우 특정한 유형의 재귀, 확장명 및 "파일 유형은 파일"로 필터링 된 문제를 가지고있었습니다
Rich Homolka

@RichHomolka 아. OP는 파일이 'pdfs'라는 디렉토리에 있다고 말했기 때문에 pdf를 재귀 디렉토리로 지정하는 방법에 문제가 있다고 가정하고 포함 된 모든 파일이 pdf 파일이므로 특별히 선택할 필요가 없습니다. 그러나 pdf 파일 만 선택하고 다른 파일은 변경하지 않고 그대로 두는 것이 좋습니다.
gwideman

52
chown -R someuser:somegroup /your/folder/here/*

이것은 지정된 폴더의 모든 파일과 모든 서브 디렉토리 및 서브 디렉토리에 chown을 적용합니다. 주의해서 사용하십시오.


2
어떻게 든 sudo chown -R user ./나를 위해 일했지만 sudo chown -R user ./*하지 않았다
Slav

1
나는 이것이 오래되었다는 것을 알고 있지만 이것이 제목에 대답하지만 질문에 대답하지는 않습니다. 이것은 실제로 OP가 이미 시도한 것보다 약간 나쁩니다.
Rich Homolka

2
@RichHomolka 질문 제목으로 인해 여기에 왔으므로이 답변을 매우 기쁘게 생각합니다.
Félix Gagnon-Grenier

@ FélixGagnon-Grenier 공정합니다. 이 답변이 효과가 있다면 매우 기쁩니다. 그러나 원래 질문에 대해서는 효과가 없었습니다.
Rich Homolka

와 같은 도트 파일에는 작동하지 않는 것 같습니다 .env.
라이언

14

find유틸리티 를 사용할 수 있습니다 :

find . -name '*.pdf' -exec chown someuser:somegroup {} +

주변의 따옴표를 잊지 마십시오 *.pdf. 그렇지 않으면 쉘이 확장을 시도합니다. 이것은 이미 쉘이 *.pdf현재 디렉토리에있는 모든 PDF 파일의 이름으로 대체됨을 의미합니다 . 그러나 그것은 당신이 원하는 것이 아닙니다. 하위 디렉토리에있는 PDF 파일을 찾으려고합니다. Btw .: 그것은 또한 당신의 chown명령에 대한 문제입니다 .


1
+성능에 대한 깔끔한 트릭 을 찾아야했습니다 . -exec command {} +이 -exec 조치 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령 행은 명령 행을 xargs빌드 하는 것과 거의 같은 방식으로 빌드됩니다. {}명령 내에서 하나의 인스턴스 만 허용됩니다. 명령은 시작 디렉토리에서 실행됩니다.
Patrick M

@PatrickM + (대) 다른 장점 + 대; .... plus는 쉘 메타 문자가 아니며 탈출 할 필요가 없습니다
Rich Homolka

6

명령

chown -R someuser:somegroup *.pdf

디렉토리 이름이 .pdf로 끝나는 경우에만 디렉토리가 재귀됩니다 . 다음과 같은 것이 필요합니다.

find . -name "*.pdf" -exec chown someuser:somegroup {} \;

기술적으로는 한 단계 아래로 내려갑니다. 당신이 진정한 재귀를 호출하는지 여부는 사용자를위한 운동입니다 :)
Rich Homolka

1

디렉토리의 소유권을 재귀 적으로 변경하려면 다음을 사용하십시오.

sudo chown -R <username>:<groupname> <dir name>

여기서 username = 디렉토리의 소유자 여야하는 새로운 사용자

groupname = 디렉토리의 소유자 여야하는 새 그룹

모든 파일 / 디렉토리에는 사용자 소유자와 그룹 소유자가 있습니다


이것은 OP가 요청한 것을 수행하지 않습니다. 이로 인해 모든 소유권이 변경되었으며 OP는 특정 파일 세트를 요청했습니다.
Rich Homolka

0

tree대신에 사용 합니다 :

 sudo tree -fai ~/.blabla  | xargs -L1 -I{} sudo chown youruser:youruser {}

또한 '/'디렉토리 또는 다른 시스템 디렉토리에서 재귀 chown 또는 chmod를 실행하지 않도록주의하십시오.


0

디렉토리에있는 모든 파일의 소유자가 되려면

find directory -type f -name '*' | sudo xargs -d '\n' chown $USER

대신에

sudo chown $USER directory\*

또는

sudo chown --recursive $USER directory

*에 의해 생성 된 인수가 너무 많거나 (디렉토리에 파일이 너무 많음) 각각 원하는 것을 수행하지 않으면 작동하지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.