Bash 스크립트를 작성하려고 합니다. 폴더를 재귀적으로 살펴보고 파일과 폴더를 나열하고 개수를 셉니다.
어느 정도 작동하지만 "find"가 권한이 거부된 디렉토리에 도달하면 스크립트 실행을 계속합니다. 디렉터리를 건너뛰고 그 안의 파일 수를 세지 않으며 디렉터리에 대한 권한이 거부되었다는 메시지도 표시하지 않습니다. (스크립트가 파일 관리자 사용자 정의 작업을 통해 실행되기 때문에 사용할 수 없는 쓸모없는 터미널 명령을 제외하고)
Find에서 권한이 거부된 폴더를 찾으면 검색 프로세스를 중지하고 권한이 거부된 폴더를 나에게 다시 보고하도록 하고 싶습니다. 그래서 나는 그것이 건너뛴 것과 그 이유를 알고 있습니다.
내 코드의 절반은 다음과 같습니다
#!/bin/bash
allfolders=("$@")
nfolders="0"
Nfilesinfolders="0"
filesinfolder="0"
results=""
noteadded="0"
for directory in "${allfolders[@]}"; do
echo "This is where I try and insert the code examples below.
echo "and want it to exit with a zenity error"
nfolders=$(( nfolders + 1 ))
echo "$nfolders"
if [[ $nfolders -ge 11 ]]
then
if [[ $noteadded -ge 0 ]]
then
results+="\n"
results+="Not adding any more folders to the list. Look at the top for total number of files"
noteadded=1
fi
else
results+="$directory\n"
fi
echo "This below attempt only worked on the top folder not folders in it"
if [[ -r "$directory" ]] && [[ -w "$directory" ]]
then
filesinfolder=$(find "$directory" -depth -type f -printf '.' | wc -c)
Nfilesinfolders=$(( Nfilesinfolders + filesinfolder ))
else
zenity --error --title="Error occured check message" --text="The directory\n $directory\n is not readable or write-able to you $USER\n please run as root"
exit $?
fi
done
실패한 시도 중 일부는 다음과 같습니다.
find "$directory" -depth -type d -print0 | while IFS= read -r -d $'\0' currentdir
do
echo "Checking "$currentdir" in directory "$directory""
if [[ ! -r "$currentdir" ]] && [[ ! -w "$currentdir" ]]
then
zenity --error --title="Error occurred check message" --text="The directory\n $currentdir\n is not readable or write-able to you $USER\n please run as root"
exit $?
fi
done
위의 코드는 그냥 건너뛴 것으로 보이며 스크립트 실행이 계속됩니다.
다음은 이런 모습입니다. 오류를 보고하도록 할 수는 있지만 어느 폴더에 문제가 있는지는 알 수 없습니다.
shredout=$(find "$directory" -depth -type d -print0 2>&1 | grep "Permission denied" && echo "found Permission Denied" && checkfolderperm="1" )
if [[ $checkfolderperm -eq 1 ]]
then
zenity --error --title="Error occurred check message" --text="The directory\n $directory\n is not readable or write-able to you $USER\n please run as root"
exit $?
fi
하지만 위의 내용도 생략된 것 같습니다.
마지막 시도는 첫 번째 시도와 매우 유사했습니다.
while IFS= read -r -d $'\0' currentdir; do
echo "going through file = $currentdir in folder $directory"
if [[ ! -r "$currentdir" ]] && [[ ! -w "$currentdir" ]]
then
zenity --error --title="Error occured check message" --text="The directory\n $currentdir\n is not readable or write-able to you $USER\n please run as root"
exit $?
fi
done < <(find "$directory" -depth -type d -print0)
하지만 이것도 생략하겠습니다.
find.txt를 통해 폴더를 탐색할 수 있는 방법이 있나요? 그런 다음 디렉토리에 권한이 거부되면 중지하고 보고합니다.
나는 bash "트랩"과 bash "함수"를 접했지만 그것이 나에게 맞는 솔루션인지 또는 어떻게 사용하는지 모릅니다.
이것은 "meuh"의 도움으로 얻은 코드입니다. 스크립트를 중지하고 액세스할 수 없는 폴더/폴더를 정확하게 보고합니다. 나에게 도움이 된 만큼 다른 사람들에게도 도움이 되기를 바랍니다.
if finderrors=$(! find "$directory" -depth -type d 2>&1 1>/dev/null)
then
zenity --error --title="Error occurred check message" --text="$finderrors"
exit $?
fi
답변1
find
오류가 발견되면 해당 반환 코드는 0이 아닌 값으로 설정됩니다. 그래서 당신은 이것을 할 수 있습니다 :
if ! find ...
then echo had an error >&2
fi |
while ...
(찾기 출력으로 무엇을 하려는지 잘 모르겠습니다).
stderr(파일 설명자 2)의 찾기에서 모든 오류 메시지를 수집하려면 2를 파일로 리디렉션할 수 있습니다. 예를 들어:
if ! find ... 2>/tmp/errors
then zenity --error --text "$(</tmp/errors)"
fi |
while ...