findが権限が拒否されたフォルダに到達すると、bashを終了します。

findが権限が拒否されたフォルダに到達すると、bashを終了します。

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エラーが見つかると、対応する戻りコードはゼロ以外の値に設定されます。だからあなたはこれを行うことができます:

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 ...

おすすめ記事