"bin" 하위 디렉터리에 있는 파일에만 실행 권한 부여

"bin" 하위 디렉터리에 있는 파일에만 실행 권한 부여

그 안에 여러 응용 프로그램이 있는 상위 디렉터리가 있고 각 응용 프로그램에는 자체 bin하위 디렉터리가 있습니다.

parent
--app1
  --bin
  --(maybe some other bins on even lower level)
--app2
  --bin
...

내가 원하는 것은 bin폴더 자체가 아닌 파일에 실행 권한을 추가하는 것입니다.

bin위의 구조는 규칙적이지 않습니다(따라서 특정 깊이/레벨에 있다는 것을 예측하기 위해 루프를 사용할 수는 없습니다 ).

지금까지 내가 가진 것은 다음과 같습니다.

find /parent -type d -iname "bin" -exec chmod -R a+x {} \;

chmod -R각각에 대해 수행해도 아무런 해가 없다는 것을 알고 있지만 bin더 깔끔한 방법을 찾기 위해 +x파일에만 적용하고 싶습니다.

답변1

x디렉토리에 대한 허용이 필요합니다 . 디렉토리를 나열하고 그 안에서 파일을 찾는 것은 x디렉토리에 대한 권한을 의미합니다.

즉,

-exec chmod -R a+x {}/* \;

xdir 자체가 아닌 dir의 내용에만 할당됩니다 .

중첩된 디렉토리를 처리하려면 bin다음과 같은 것을 사용하십시오.

while read F; do \
  test -f "$F" || continue \
  test $(basename $(dirname "$F")) == "bin" || continue \
  chmod a+x "$F" \
done < find /path/to/base -type f

답변2

몇 가지 접근 방식이 있습니다.

  • Eugen이 언급했듯이 디렉토리에 +x는 정상입니다. 내용에 액세스하려면 필요하기도 합니다. 스크립트가 전 세계에서 실행 가능하도록 하려면 현재 방법을 계속 사용하고 디렉터리도 전 세계에서 이동할 수 있도록 만드는 것이 좋습니다.

  • bash의 확장된 glob을 사용하여 bin모든 깊이의 모든 디렉터리를 수집할 수 있습니다.

    shopt -s globstar; find **/bin/ -type f -exec chmod a+x {} \;
    

    동일하지만 유형 확인이 없습니다.

    shopt -s globstar; chmod -R a+x **/bin/
    
  • 여러 통화 사용 find:

    find . -type d -name bin | while read -r path; do
        find "$path/" -type f -exec chmod a+x {} \;
    done
    

    (이것은 파일 이름에 줄 바꿈이 없다고 가정합니다. 만약 그렇다면 걱정해야 하며 사용할 예제 -print0등을 조정해야 합니다.)

  • find -exec불행히도 다른 항목 안에 직접 중첩할 수는 없지만 find -exec이후에 find -exec를 호출하는 스크립트를 호출할 수 있습니다.

    find . -type d -name bin -execdir sh -c "find . -type f -exec chmod a+x {} \;" \;
    

    이는 번거로운 {} 중첩을 피하기 위해 -execdir대신 사용됩니다.-exec

관련 정보