쉘 스크립트 파일에 대한 실행 권한을 확인하고 할당하는 방법은 무엇입니까?

쉘 스크립트 파일에 대한 실행 권한을 확인하고 할당하는 방법은 무엇입니까?

현재 디렉터리와 아직 실행 권한이 할당되지 않은 하위 디렉터리의 모든 .sh 파일에 실행 권한을 할당하는 .sh 스크립트를 작성 중입니다.

단 하나의 명령으로 현재 디렉터리와 그 하위 디렉터리에 포함된 모든 .sh 파일에 실행 권한을 쉽게 할당할 수 있습니다.

find -type f -iname '*.sh' -exec chmod +x {} \;

위 명령은 현재 디렉터리와 하위 디렉터리의 모든 .sh 파일에 실행 권한을 할당합니다. 하지만 이 .sh 파일에 실행 권한이 할당되었는지 확인하려면 조건문만 필요합니까? 그렇지 않은 경우 파일에 실행 권한을 할당하는 명령을 실행하십시오.

귀하의 답변은 매우 도움이 될 것이며 귀하의 답변에 매우 감사하겠습니다.

답변1

찾고 계시는 것 같아요-executable옵션, 부정하다-not

$ ls -l
-rwxrwxr-x ... cmd.sh
-rw-rw-r-- ... foo.txt

$ find . -not -executable
./foo.txt

따라서 귀하의 경우에는 다음과 같이 할 수 있습니다.

find -type f -iname '*.sh' -not -executable -exec chmod +x {} \;

답변2

옵션을 사용해 보았습니다 -perm.

find . -perm /a=x 

모든 곳에서 x비트가 일치합니다a

그래서 당신은 필요

find . -not -perm /a=x

이것은 허용되는 답변의 모호한 형태입니다.

당신은 그것을 사용할 수 있습니다

find -perm /go=x

g그룹 또는 o실행 파일 과 일치합니다 .

불행하게도 누락된 비트를 직접 테스트할 수는 없습니다.

답변3

파일이 실행 가능한지 확인할 필요가 없습니다. chmod파일에 이미 할당된 권한이 있으면 명령이 실패하지 않습니다. 파일의 권한을 먼저 확인하면 아무것도 저장되지 않습니다.

제가 이 명령에 대해 제안하고 싶은 유일한 변경 사항은 chmod파일당 한 번이 아니라 가능한 한 많은 파일에 대해 한 번 호출하는 것입니다.

find . -name '*.sh' -type f -exec chmod +x {} +

비표준 -iname테스트도 일반 -name테스트로 변경했습니다. 실제로 .sh, .Sh, .sH및 파일 이름 접미사가 포함된 파일이 혼합되어 있지 않다고 가정합니다 .SH. 있는 경우 이를 수정하고 싶을 수도 있습니다. 수행 방법은 다음과 같습니다.

find . -type f -iname '*.sh' ! -name '*.sh' -exec sh -c '
    for pathname do
        mv "$pathname" "${pathname%.??}.sh"
    done' sh {} +

파일 이름 충돌은 여기에서 확인되지 않습니다. GNU 시스템을 사용하는 경우 mv -b이름 충돌이 발생할 경우 이를 사용하여 백업을 생성할 수 있습니다 . 언제나 그렇듯이 먼저 백업 데이터 사본에서 임의의 사람들의 코드를 테스트하십시오.

관련 정보