특정 폴더의 모든 파일을 읽고 쓸 수 있도록 권한을 변경하려고 하는데 파일에 "DATA"라는 문자열이 있어야 합니다.
이 명령을 사용해 보았으나 어떻게 필터링해야 할지 모르겠습니다. grep을 사용해야 합니까?
grep -nr DATA | chmod u=rw,g=rw,o=rw *
답변1
지금 삭제된 질문에 대한 댓글에서 말했듯이스택 오버플로:
grep -rl DATA "foldername" | xargs -n1 chmod =rw
...경고: 파일 이름에 공백이 있으면 작동하지 않습니다.
저는 여러분이 실제 생활에 참여하기 전에 Linux/Unix 도구 모음 튜토리얼을 많이 읽고 도구가 어떻게 함께 작동하는지 파악하는 것을 적극 권장합니다.
귀하의 호출은 모든 것을 변경하지만 chmod
기본적으로 아무것도 출력되지 않으므로 grep
아무것도 출력하지 않습니다.아무것도 없다.
너 뭐야필요내 예에서 볼 수 있듯이, 필요한 것은 그 안에 있는 파일을 찾고 DATA
해당 권한을 수정하는 것뿐입니다.
답변2
chmod
파일에 "DATA" 문자열이 포함되어 있으면 디렉터리의 모든 파일을 재귀적으로 찾아 실행할 수 있습니다.
perm.sh:
#!/bin/bash
grep -w "DATA" "$1" && chmod 666 "$1"
find
일반 파일을 재귀적으로 검색하는 경우 (감사합니다.스티븐)
find <path/of/folder> -type f -exec bash </path/of/perm.sh> {} \;
답변3
이미 사용하고 있는 GNU -r
확장 덕분에 grep
다음을 수행할 수 있습니다.
grep -rlZ DATA . | xargs -r0 chmod a=rw
정규식과 일치하는 행이 하나 이상 포함된 파일을 -l
나열하는 데 사용됩니다 . (GNU grep
l
확장자 이기도 함 -Z
) 출력을 사후 처리할 수 있도록 NUL로 구분된 파일 경로를 인쇄합니다.
xargs -0
² 통과하려면 NUL에서 출력을 분할하세요.별도의 매개변수로유틸리티 에 chmod
. ² 의 경우 -r
입력이 비어 있으면(파일 경로가 보고되지 않음) xargs
전혀 실행되지 않습니다.chmod
grep
이미 권한이 있는 파일을 건너뛰려면 다음을 수행하세요 rw-rw-rw-
.
find . -type f ! -perm a=rw -exec grep -lZ DATA {} + |
xargs -r0 chmod a=rw
이식 가능한 방법은 다음과 같습니다.
find . -type f \
! -perm a=rw \
-exec grep -q DATA {} ';' \
-exec chmod a=rw {} +
하지만 grep
각 파일이 하나씩 실행되므로 효율성이 크게 떨어집니다.
어쨌든 세상에 쓰기 가능한 데이터 파일을 갖는 것은 매우 나쁜 생각처럼 들립니다.
또한 chmod
파일의 권한을 변경할 때 심볼릭 링크를 따르므로 파일이 일반 파일에서 /etc/shadow
사용자 에 대한 심볼릭 링크로 변경되는 경우 ~/.bashrc
(또는 심볼릭 링크에 대한 변경 사항이 ./dir
있는 경우) 파일은 다음 사이에서 발견되어 실행됩니다. 잘못된 파일에 대한 권한을 변경하게 될 수도 있습니다../dir/shadow
/etc
find
chmod
따라서 누구나 쓰기 가능한 디렉터리에서는 이러한 명령을 실행하고 싶지 않습니다.
GNU/Linux 시스템을 사용 중이라면 다음을 zsh
통해 이러한 문제를 피할 수 있습니다.
find . -type f ! -perm a=rw -execdir zsh -c '
zmodload zsh/system || exit
for file do
sysopen -o nofollow -u0 -- $file &&
grep -q DATA &&
chmod a=rw /dev/stdin
done' {} +
디렉토리 트리를 내려갈 때 Where는 find
기호 링크를 따르지 않도록 주의하고 -execdir
명령(여기 zsh
)을 사용하여 발견된 파일이 포함된 디렉토리에서 실행합니다. 심볼릭 링크( ption ) zsh
를 따르지 않고 파일을 여는 일을 담당하며 Linux에서는 파일이 삭제되거나 이름이 변경된 경우에도 열린 실제 파일을 가리키도록 보장되는 열린 파일을 가리키는 마법의 심볼릭 링크입니다.nofollow
o
/dev/stdin
/dev/stdin
일부 다른 기능은 grep
이제 지원되지만 -r
디렉터리 생략을 거의 허용하지 않으며 .
최신 버전의 GNU에서는 / 도 사용할 grep
때 기본적으로 디렉터리를 사용합니다.-r
-R
² -r
도 -0
GNU 확장이지만 현재 다른 구현에서 널리 사용되고 있으며 POSIX 표준의 다음 버전에도 나타날 수 있습니다.