find 명령의 파이핑 출력

find 명령의 파이핑 출력

내 질문에 추가로 게시되었습니다 - sh와 함께 find 사용 - 명령이 작동하지 않음

아래 명령의 o/p에 따라 나열된 각 파일에 대해 권한을 777로 업데이트해야 합니다.

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls

chmod출력을 파이프 하고 파일 권한을 업데이트 할 수 있는 방법이 있습니까 ?

답변1

파일에서 실행할 다른 -exec항목을 추가할 수 있습니다 . 필요하지 않으면 제거하십시오 .findchmod-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

... 여기서 ., N및 는 테스트(심볼릭 링크와 일치하지 않음), 설정 및 설정 에 D해당합니다 .-fnullglobdotglobbash

관련 정보