2009-10-14 3 views
1

디렉토리 경로 인 단일 명령 줄 인수를 사용하는 스크립트가 필요합니다. 스크립트는 인수가 실제로 디렉토리인지 여부를 확인해야합니다. 디렉토리 인 경우 스크립트는 디렉토리에있는 하위 디렉토리의 보호 모드를 600으로 변경해야합니다. 인수가 디렉토리가 아닌 경우 적절한 메시지를 출력해야합니다.제공된 경로 (BASH)의 하위 디렉토리를 chmod하는 방법

I 가지고

[$ 1 -d] 경우; 다음 다른


는 기본적으로 나는 빈 줄에 넣어 모르는

Fi를 "이 아닌 디렉토리입니다"에코. 나는 chmod로 바보짓을하고 있었지만 내 줄은 서브 디렉토리가 아니라 입력 된 경로를 바꾸고 싶었다.

+0

(600)는 디렉토리 굉장히 이상한 권한 마스크 - 당신은 루트가 아닌 모두를 위해 오히려 쓸모없는 디렉토리를 만드는 실행/검색 비트를 누락하고 있습니다. – ephemient

답변

8
 
if test -d "$1"; then 
    find "$1" -type d -exec chmod 600 '{}' \; 
else 
    echo "Not a directory: $1" >&2 
    exit 1 
fi 

다양한 변종이 빠를 수 있지만 고대 find 또는 xargs의 기능에 따라 달라질 수 있습니다.

find "$1" -type d -exec chmod 600 '{}' + 
find "$1" -type d -print0 | xargs -0r chmod 600 
+0

개인적으로는 오류 메시지 인쇄를 건너 뜁니다. 사용자의 목표는 "이 명령을 실행 한 후 모든 하위 디렉토리에 600의 허가가 있어야합니다"입니다. 파일을 제공하면 파일에 하위 디렉토리가 없으므로 해당 조건이 충족됩니다. –

+0

만약 내가 그것을 디자인했다면, 나는 당신과 동의 할 것이다 : 스크립트는 단지'find' 명령 일 뿐이며 다른 것은 없다. 하지만 저는 OP의 구조에 주로 따르고 있습니다. – ephemient

+3

roger34도'$ 1'도 600으로 변경해야하는지 확실하지 않습니다. 명령이'find "$ 1"-mindepth 1 -type d ...' –

0
([ -d "$1" ] && find $1 -type d -mindepth 1 | xargs chmod 600 | true) || echo 'Not a directory' 
+0

이 해결책에 3 가지 문제가 있으면 시작해야합니다. 관련된 경로 중 공백이있다. (해결책 :'find "$ 1"... -print0 | xargs -0 ...'을 사용하거나'-exec' 옵션을 찾는다.); 둘째, $ 1이 디렉토리라면 "Not a directory"를 출력하지만 chmod에는 어떤 에러가 발생합니다 (예 : 일부 하위 디렉토리를 chmod 할 수있는 권한이 없습니다) (해결책 :'if ... then ... else .. '&&'와'||'대신에 .fi'); 마지막으로 문제가 있더라도 상태 0 (성공)으로 종료됩니다. –

+0

ephemient가 이미 이러한 대체품을 제공했다면 이미 제공된 솔루션을 복제하는 것보다는 단선 솔루션을 제공하기 만했습니다. 찾기 기능을 사실로 연결하여 chmod 오류를 해결하는 것은 쉽습니다 (예 : "... 600 | true)". 수정 중 ... – nicerobot

관련 문제