그 안에 여러 응용 프로그램이 있는 상위 디렉터리가 있고 각 응용 프로그램에는 자체 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 {}/* \;
x
dir 자체가 아닌 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