我正在尝试在特定位置查找一些大文件:
此命令有效并返回一些结果:
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 不返回与第一个命令相同的结果?
在您的命令中,
sudo
only 赋予命令额外权限find
,而不是 shell。因此,如果您从高处开始,find
则能够下降到文件树中并向您显示内容。但是您的外壳正在尝试扩展
*
. 如果您的用户没有权限检查 的内容/nfshome/*/.local
,那么它将无法匹配其中的任何文件(例如/nfshome/*/.local/share
)。如果没有匹配,则不会传递任何内容find
。您可以通过检查 和 的输出来看到这
echo /nfshome/*/.local
一点echo /nfshome/*/.local/share
。第二个可能是空的。目前尚不清楚为什么要在第一个命令似乎起作用时执行第二个命令。您可以在子 shell 中运行整个命令,并使用
sudo
. 如sudo -c "find ..."
失败的原因与权限和通配符有关
*
。我们可以像这样在本地文件系统上重现它:设置场景,目录树下
/tmp/top
:请注意,作为普通用户,我们无权进行以下操作
/tmp/top/*/dir
:尝试从普通用户无法访问的目录以 root 权限下降:
请记住,shell 通配符的评估发生在命令执行之前。所以这里发生的是包含通配符的路径
*
被扩展。您的普通用户帐户无法验证 的存在sub
,因此无法验证整个路径。通配符保留为星号(匹配失败时的默认行为),并且 root 特权被赋予下降find
的文字路径。/tmp/top/*/dir/sub
该路径不存在,因此出现错误。尝试从我们可以作为普通用户访问的目录中以 root 权限下降:
这里发生的事情是相似的,但会产生更有用的后果。该路径
/tmp/top/*/dir
可以完全作为您的普通用户进行评估,从而产生两条路径/tmp/top/a/dir
和/tmp/top/b/dir
. 这些被传递给 root privilegedfind
,然后它可以通过 root-only 子目录来降低这些 - 并列出它发现的文件。在您的情况下,如果
.local
没有 root 权限,很可能无法访问通配符路径中的目录,但较高级别的目录是可以访问的。当您指定可以作为普通用户帐户评估的路径时,find
可以继续使用扩展的路径集。一旦您指定了无法在普通用户帐户的上下文中评估的路径,扩展就会失败并find
传递一个包含文字*
字符的路径。这当然不匹配和find
失败。要解决此问题,您只需推迟对路径的评估,直到您的命令以 root 身份运行: