find 测试和 bash 测试没有给出相同的结果,为什么?

find 测试和 bash 测试没有给出相同的结果,为什么?

在我之前的问题中在find -exec中,如何用{}替换当前文件?,我已经询问过测试find。我想找到所有不属于我的文件。所以有正确的 find 命令:

find . -type f ! -user "$USER"

但这个也应该是这样:

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

但两者都给出了不同的结果。

1) 如果我这样做[command one] | wc -c--> 4121

但是:[command two] | wc -c--> 236768 (PS:我正在 $HOME 中搜索文件)。

两者都给出了不同的发现文件数量。

2)两者仍然给出结果文件,即目录(是的,我不拥有目录,因此 - 权限被拒绝)。尽管find . -type f选项参数中有类型文件(而不是目录),但他们还是给出了目录,为什么? (当我ls -ld其中一个目录时,没有一个是链接或其他任何内容)

答案1

嗯...,在我的主目录中,这两个命令的工作方式相同。 8-/

尽管如此,您应该将 stderr 重定向到 /dev/null 并使用wc -l它来正确计算输出。

find . -type f ! -user "$USER" 2>/dev/null | wc -l
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + | wc -l

从这里您可以将结果重定向到文本文件并比较文件以查找差异。

find . -type f ! -user "$USER" 2>/dev/null > /tmp/file_1.txt
find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' 2>/dev/null bash {} + >/tmp/file_2.txt
diff /tmp/file_{1,2}.txt

如果存在差异,请取出 /tmp/file_2.txt 的一些多余文件,并进一步调查为什么该文件不被视为“如果文件存在且由有效用户 ID 拥有,则为 True”。

答案2

为了避免find输入您实际上无法访问的目录,您可以使用! -executable -prune

find . ! -executable -prune -type f ! -user "$USER"

-executable对于您无权访问的目录,否定测试将成立,并将-prune从 的搜索树中删除这些目录find,阻止实用程序尝试访问它们,从而避免生成权限错误。

-executable测试(以及类似的-readable-writable测试)是非标准的,需要 GNU find

我(还)无法对结果的差异发表任何评论,因为您对此只字未提。由于输出的大小差异如此之大,因此查找和检查一个命令找到了另一个命令未找到的内容的情况应该是微不足道的。

相关内容