我试图这样做,但是我唯一的方法就是使用返回码。这样做的缺点是,在我的情况下,因为我必须生成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
答案 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试试。