명령이 모든 것을 나열하는 쉘 스크립트를 생성하려고 합니다.읽기 및 실행 가능사용자가 누구인지, 사용자가 어디에 있는지에 관계없이 나 또는 현재 사용자가 허용하는 파일입니다. 따라서 나중에 권한을 변경하더라도 변경 사항은 계속 반영됩니다.
이것이 내가 지금까지 가지고 있는 것입니다:
user=`id -un`
group=`id -gn`
IFS='
'
for file in `ls -al /home/cg/root`; do
perm=$(echo $file | awk '{print $1}')
fileowner=$(echo $file | awk '{print $3}')
filegroup=$(echo $file | awk '{print $4}')
ownerreadbit=${perm:1:2}
ownerexecbit=${perm:3:4}
groupreadbit=${perm:4:5}
groupexecbit=${perm:6:7}
worldreadbit=${perm:7:8}
worldexecbit=${perm:9:10}
if ["$user"=="$fileowner" && "$ownerreadbit"=="r" && "$ownerexecbit"=="x"]; then
echo $file
elif ["$group"=="$filegroup" && "$groupreadbit"=="r" &&" $groupexecbit"=="x"]; then
echo $file
elif ["$worldreadbit"=="r" && "$worldexecbit"=="x"]; then
echo $file
fi
done
답변1
GNU find
명령을 사용하지 않는 이유는 무엇입니까?
find /home/cg/root -readable -executable
아니면 파일 목록만 나열하세요.
find /home/cg/root -readable -executable -type f
답변2
사용자 IporSricer의 답변 find /home/cg/root -readable -executable
이 올바른 선택입니다. 또한 이 find
명령에는 각 파일에 대해 가능한 많은 세부 정보를 포함하는 옵션을 포함하여 출력 형식을 사용자 정의할 수 있다는 추가 이점이 있습니다. 페이지 -printf
의 옵션을 참조하세요 man
. 이 답변의 주요 목적은 향후 스크립팅 질문에 대한 유용한 피드백을 제공하는 것입니다.
출력을 사용하여
ls
스크립트를 작성하지 마십시오! 초보자들이 흔히 저지르는 실수입니다. 인용하다왜 `ls`를 구문 분석하지 *않나요*?를 사용하지 말고
ls
그냥 쉘의 네이티브를 사용하세요파일 글로빙,예를 들어./home/cg/root/*
. 이것이 바로 이 기능이 존재하는 이유 중 하나입니다.귀하의 스크립트는 하위 디렉토리에 떨어지지 않지만 userIporSricer의 답변은 그렇습니다.
쉘의 하위 문자열 확장 기능을 잘못 사용하고 있으므로 테스트가 작동하지 않습니다. 두 번째 매개변수는 하위 문자열입니다.길이는 끝 위치가 아니므로 단일 문자 하위 문자열을
${perm:1:2}
원하는 경우 두 문자 하위 문자열이 반환됩니다${perm:1:1}
.더 빠른 테스트는 양식의 별도 변수를 정의한
owner=${perm:1:2}
다음 "rx"에 대해 테스트하는 것입니다.&&
test 명령에서만 작동한다고 말하는 것 같아서 놀랐습니다[
. 에서만 작동할 것이라고 생각했습니다[[
.세 가지
if
,elif
, 모두elif
동일한 작업을 수행하므로 논리 OR 연산자(테스트 외부)를 사용하여echo
하나로 결합할 수 있습니다.if
||
[
이것이 유용하길 바랍니다.