내 질문에 추가로 게시되었습니다 - 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
... 여기서 .
, N
및 는 테스트(심볼릭 링크와 일치하지 않음), 설정 및 설정 에 D
해당합니다 .-f
nullglob
dotglob
bash