현재 디렉터리와 아직 실행 권한이 할당되지 않은 하위 디렉터리의 모든 .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
이름 충돌이 발생할 경우 이를 사용하여 백업을 생성할 수 있습니다 . 언제나 그렇듯이 먼저 백업 데이터 사본에서 임의의 사람들의 코드를 테스트하십시오.