在权限被拒绝的第一个文件之前取消查找

时间:2019-01-02 13:36:44

标签: bash

我试图这样做,但是我唯一的方法就是使用返回码。这样做的缺点是,在我的情况下,因为我必须生成md5签名,所以它成为永恒的,一切都告诉我权限被拒绝。

因此,我想做些更有效的事情。在获得第一笔许可之前,请先取消搜索。

我当前在Bash(Ubuntu)中使用的命令是:

find "$input" -type f -exec md5sum {} + 2> /dev/null > "$tempdirectory/archive.txt"
if [ "$?" != "0" ]; then
echo
echo "Permission denied in file(s)"
echo
fi
exit

2 个答案:

答案 0 :(得分:1)

您是否尝试过将“ set -e”添加到脚本的开头?

  

set -e:如果命令以非零状态退出,则立即退出。

set -e试图向外壳添加“自动错误检测”。
它的目标是在发生错误时使Shell中止,因此我们不必在每个重要命令后放置|| exit 1
但这不是很可靠,被认为是不好的做法。

trap是一个更好的选择,它的正确实现适用于任何级别的函数嵌套,任何流程。

#!/bin/bash
trap 'echo "failed with exitcode $?" 1>&2' ERR

# your "find" code here

由于“权限被拒绝”的返回状态为“ 1”,因此可以用来取消搜索。
您可以在here右边的trap上了解更多信息

答案 1 :(得分:0)

假设您使用的是GNU find,我将使用以下内容:

find "$input" ! -readable -fprintf /dev/stderr '%p cannot be read ! Switch to root.\n' -a -quit -o -type f -exec md5sum {} + > "$tempdirectory/archive.txt"

一旦找到不可读的文件或目录,它将在stderr上输出一条消息,指出该不可读的文件,然后中止。在这种情况发生之前,它会聚合文件名以将其传递到md5sum,其输出(在stdout上)将重定向到archive.txt文件。

从我的测试看来,该解决方案似乎也不完美,因为-quit不会立即退出,而是在到达时运行正在构建的-exec [...] +find'的手册中提到了-execdir [...] +,但我想它会扩展到-exec。您可以改用-exec [...] \;来避免这种情况,但对名义性能的影响可能很大。

它依靠-readable谓语来确定用户是否可以读取该文件,否则它将运行-fprintf-quit操作以首先向stderr打印错误消息(这样它就不会重定向到您的输出文件),然后中止搜索。

您可以here试试。