发现没有返回预期的文件

发现没有返回预期的文件

我试图在特定位置找到一些大文件:

该命令有效并返回一些结果:

admin@tyrell:~$ sudo find /nfshome/*/.local/ -type f -size +1G -exec ls -lh {} \;
-rw-r--r-- 1 9917183 students 5.2G Jun  5  2017 /nfshome/9917183/.local/share/Trash/files/result_25.zip
-rw-r--r-- 1 9918178 students 4.0G Sep  6  2018 /nfshome/9918178/.local/share/unity3d/Asset Store-5.x/Unity Technologies/Unity EssentialsSample Projects/3D Game Kit.unitypackage
-rw-r--r-- 1 9919185 students 2.1G Mar  6  2018 /nfshome/9919185/.local/share/Trash/files/agggg.avi
-rw-r--r-- 1 9919382 students 1.7G Jan 17  2017 /nfshome/9919382/.local/share/Trash/files/MageWar.avi
-rw-r--r-- 1 9921459 students 1.8G Apr 12 11:58 /nfshome/9921459/.local/share/Trash/files/takeout-20190412T182950Z-001(1).zip
-rw-r--r-- 1 9921459 students 1.8G Apr 12 11:58 /nfshome/9921459/.local/share/Trash/files/takeout-20190412T182950Z-001.zip
-rw-r--r-- 1 9921459 students 1.4G Apr 12 11:56 /nfshome/9921459/.local/share/Trash/files/takeout-20190412T182950Z-003.zip
-rw-r--r-- 1 9921459 students 1.4G Apr 12 11:58 /nfshome/9921459/.local/share/Trash/files/takeout-20190412T182950Z-003(1).zip

但如果我尝试通过添加一个子目录 来缩小搜索范围,share/我什么也得不到,而我期望得到完全相同的结果,因为上面的所有内容都在share/

admin@tyrell:~$ sudo find /nfshome/*/.local/share/ -type f -size +1G -exec ls -lh {} \;
admin@tyrell:~$ 

为什么 find 不返回与第一个命令相同的结果?

答案1

在您的命令中, only为命令而不是 shellsudo提供额外的权限。find因此,如果您从高处开始,find就能够下降到文件树并向您显示内容。

但是您的 shell 正在尝试扩展*.如果您的用户没有检查 的内容的权限/nfshome/*/.local,则它将无法匹配其中的任何文件(例如/nfshome/*/.local/share)。如果没有匹配,则不会将任何内容传递给find

echo /nfshome/*/.local您可以通过检查和的输出来看到这一点echo /nfshome/*/.local/share。第二个可能是空的。

尚不清楚为什么当第一个命令似乎可以工作时,您想执行第二个命令。您可以在子 shell 中运行整个命令,并使用sudo.例如sudo -c "find ..."

答案2

失败的原因与权限和通配符有关*。我们可以在本地文件系统上重现它,如下所示:

  1. 设置场景,目录树位于/tmp/top

    sudo -s <<'x'
    mkdir -p /tmp/top/{a,b}/dir/sub/
    touch /tmp/top/{a,b}/dir/sub/file
    chown root /tmp/top/?/dir
    chmod go= /tmp/top/?/dir
    x
    
  2. 请注意,作为普通用户,我们没有权限执行以下操作/tmp/top/*/dir

    find /tmp/top/?/dir -type f
    find: ‘/tmp/top/a/dir’: Permission denied
    find: ‘/tmp/top/b/dir’: Permission denied
    
  3. 尝试从我们的目录中以 root 权限降序不能达到作为普通用户:

    sudo find /tmp/top/*/dir/sub -type f
    find: ‘/tmp/top/*/dir/sub’: No such file or directory
    

    请记住,shell 通配符的评估发生在命令执行之前。所以这里发生的是包含通配符的路径*被扩展。您的普通用户帐户无法验证 的存在sub,因此无法验证整个路径。通配符保留为星号(匹配失败时的默认行为),并且 root 特权被赋予下降的find文字路径。/tmp/top/*/dir/sub该路径不存在,因此出现错误。

  4. 尝试使用 root 权限从我们可以作为普通用户访问的目录进行降序:

    sudo find /tmp/top/*/dir -type f
    /tmp/top/a/dir/sub/file
    /tmp/top/b/dir/sub/file
    

    这里发生的情况类似,但具有更有用的结果。/tmp/top/*/dir可以像普通用户一样完全评估该路径,从而产生两个路径/tmp/top/a/dir/tmp/top/b/dir。这些文件被传递到 root 特权目录find,随后它可以通过仅 root 子目录来向下查找这些文件,并列出它发现的文件。

在您的情况下,如果没有 root 权限,通配符路径中的目录很可能.local无法访问,但更高级别的目录是可以访问的。当您指定可被评估为普通用户帐户的路径时,find可以继续处理扩展的路径集。一旦您指定了无法在普通用户帐户上下文中计算的路径,扩展就会失败,并find传递一个包含文字*字符的路径。这当然无法匹配并且find失败。

要解决此问题,您只需推迟对路径的评估,直到命令以 root 身份运行:

sudo bash -c "find /nfshome/*/.local/ -type f -size +1G -exec ls -lh {} \;"

相关内容