권한이 잘못된 파일을 찾는 스크립트가 있습니다. 문제가 발견되면 사용자에게 문제를 수정할 것인지 표시할 것인지 묻습니다. 동일한 명령을 여러 번 실행하지 않도록 검색 결과는 변수에 저장됩니다.
#!/usr/bin/env sh
results=$(find "$0" -type f -not -perm 644)
if [ -z "$results" ]; then
echo 'No files with incorrect permissions found'
else
while true; do
read -p 'Fix files with incorrect permissions? (yes/no/show) ' ans
case "$ans" in
Y | y | yes)
echo 'Changing file permissions...'
chmod 644 "$results"
break;;
N | n | no)
break;;
S | s | show)
echo "$results";;
*)
echo 'Please answer yes or no';;
esac
done
fi
문제는 chmod
개행으로 인해 오류가 발생한다는 것입니다.
chmod: cannot access 'test/foo'$'\n''test/bar'$'\n''test/foo bar': No such file or directory
주변 따옴표를 제거하면 "$results"
조금 더 잘 작동하지만 공백이 포함된 파일 이름에는 문제가 있습니다.
여기저기 돌아다니고 있는데 IFS=$'\n'
이걸 어디에 설정해야 할지 모르겠어요. 이것은 작동하지 않는 것 같습니다:
IFS=$'\n' chmod 644 $results
그러나 이는 다음을 수행합니다.
IFS=$'\n'
chmod 644 $results
unset IFS
이것이 맞는지 아니면 더 좋은 방법이 있는지 알고 싶습니다.
답변1
줄 바꿈으로 설정하면 IFS
도움이 되지만 여전히 1) 줄 바꿈이 있는 파일 이름(분명히), 2) 전역 문자가 있는 파일 이름의 문제가 남습니다. 예를 들어, 이름이 지정된 파일은 *
디렉터리의 모든 파일 이름으로 확장됩니다.
Bash에서는 mapfile
/를 사용하여 readarray
배열을 채웁니다.
mapfile -d '' files < <(find . -type f ! -perm 0644 -print0)
printf "%d matching files found\n" "${#files[@]}"
printf "they are:\n"
printf " %q\n" "${files[@]}"
또한보십시오:
답변2
IFS
chmod
이전에 설정 하고 직후에 해제하는 것보다 이전/이후에 설정 /해제하면 잘 작동하는 것 같습니다.find
그리고주석에서 제안한 대로 서브쉘을 배열로 래핑합니다.
IFS=$'\n'
results=($(find "$0" -type f -not -perm 644))
unset IFS
이렇게 하면 chmod 644 "${results[@]}"
개행 문자가 포함된 파일 이름이 없는 한 배열의 항목 수가 정확하고 예상대로 작동합니다(누군가 의도적으로 이렇게 하는 이유는 상상할 수 없지만).