내가 게시 한 쿼리에 따라 - sh와 함께 find 사용 - 명령이 작동하지 않습니다.
다음 명령의 o/p에 따라 나열된 각 파일의 권한을 777로 업데이트해야 합니다.
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls
출력을 파일로 파이프 chmod
하고 파일 권한을 업데이트할 수 있는 방법이 있습니까?
답변1
파일에 대해 수행할 -exec
다른 항목을 추가할 수 있습니다 . find
필요하지 않은 경우 chmod
다음을 삭제하세요.-ls
find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \;\
-ls -exec chmod 777 {} +
답변2
-exec
마지막에 다른 것을 추가하여 이전 테스트를 통과한 파일의 권한을 업데이트할 수 있습니다.프레디 쇼처럼, 또는 인라인 스크립트에서 grep
및 를 결합 할 수 있습니다 .chmod
sh -c
find . -type f -name '*FW*' -exec sh -c '
for pathname do
if grep -q -i -e "chmod.*archive" -e "archive.*chmod" "$pathname"
then
chmod 777 "$pathname"
fi
done' sh {} +
find
이는 스크립트 의 루프에 대한 경로 이름 생성기 로 사용됩니다 sh -c
.
이 루프는 인라인 스크립트에 제공된 모든 경로 이름을 가져오고, 로 각 경로 이름을 테스트하고 grep
, 파일에서 패턴이 일치하면 해당 파일에 대한 권한이 (아마도) 업데이트됩니다.
bash
에서는 경로 이름을 생성하는 대신 파일 이름 글로빙 패턴을 사용할 수 있습니다 .find
shopt -s globstar nullglob dotglob
for pathname in ./**/*FW*; do
if [ -f "$pathname" ] && grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' "$pathname"
then
chmod 777 "$pathname"
fi
done
여기서 눈에 띄는 유일한 차이점은 패턴과 일치하는 심볼릭 링크도 처리한다는 것입니다.
셸 globstar
옵션을 사용하면 **
하위 디렉터리의 패턴을 재귀적으로 일치시킬 수 있습니다. 쉘 nullglob
옵션은 일치하지 않는 패턴을 확장되지 않은 상태로 유지하는 대신 사라지게 합니다. dotglob
숨겨진 이름과 패턴을 일치시키는 쉘 옵션.
zsh
쉘 에서는 다음과 같이 단축할 수 있습니다.
for pathname in ./**/*FW*(.ND); do
if grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' $pathname
then
chmod 777 $pathname
fi
done
...where .
및 N
는 테스트(단, 심볼릭 링크와 일치하지 않음), setup 및 setup 순서 D
에 해당합니다 .-f
nullglob
dotglob
bash