当 find 到达权限被拒绝的文件夹时退出 bash

当 find 到达权限被拒绝的文件夹时退出 bash

我正在尝试编写一个 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.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)上的 find 收集所有错误消息,您可以将 2 重定向到文件。例如:

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

相关内容