发现没有返回预期的文件

43T*_*cts 6 find

我正在尝试在特定位置查找一些大文件:

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

roa*_*ima 3

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

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

    \n\n
    sudo -s <<\'x\'\nmkdir -p /tmp/top/{a,b}/dir/sub/\ntouch /tmp/top/{a,b}/dir/sub/file\nchown root /tmp/top/?/dir\nchmod go= /tmp/top/?/dir\nx\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 请注意,作为普通用户,我们没有权限执行以下操作/tmp/top/*/dir

    \n\n
    find /tmp/top/?/dir -type f\nfind: \xe2\x80\x98/tmp/top/a/dir\xe2\x80\x99: Permission denied\nfind: \xe2\x80\x98/tmp/top/b/dir\xe2\x80\x99: Permission denied\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 尝试使用 root 权限从普通用户无法访问的目录进行降序:

    \n\n
    sudo find /tmp/top/*/dir/sub -type f\nfind: \xe2\x80\x98/tmp/top/*/dir/sub\xe2\x80\x99: No such file or directory\n
    Run Code Online (Sandbox Code Playgroud)\n\n

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

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

    \n\n
    sudo find /tmp/top/*/dir -type f\n/tmp/top/a/dir/sub/file\n/tmp/top/b/dir/sub/file\n
    Run Code Online (Sandbox Code Playgroud)\n\n

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

  8. \n
\n\n

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

\n\n

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

\n\n
sudo bash -c "find /nfshome/*/.local/ -type f -size +1G -exec ls -lh {} \\;"\n
Run Code Online (Sandbox Code Playgroud)\n