Bash

當 find 到達權限被拒絕的文件夾時退出 bash

  • April 16, 2019

我正在嘗試編寫一個 Bash 腳本。我在哪裡遞歸地瀏覽文件夾並列出併計算文件和文件夾。

在某種程度上它可以工作,但如果“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 瀏覽文件夾。然後停止並報告目錄是否被拒絕。

我遇到過 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

find如果看到錯誤,將其返回碼設置為非零。所以你可以這樣做:

if ! find ... 
then    echo had an error >&2
fi |
while ...

(我不確定你想對 find 輸出做什麼)。


要從 stderr(文件描述符 2)上的 find 收集所有錯誤消息,您可以將 2 重定向到文件。例如:

if ! find ... 2>/tmp/errors
then     zenity --error --text "$(</tmp/errors)"
fi |
while ...

引用自:https://unix.stackexchange.com/questions/225572