find 명령의 파이프 출력

find 명령의 파이프 출력

내가 게시 한 쿼리에 따라 - 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및 를 결합 할 수 있습니다 .chmodsh -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에 해당합니다 .-fnullglobdotglobbash

관련 정보