我试图在特定位置找到一些大文件:
该命令有效并返回一些结果:
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
失败的原因与权限和通配符有关*
。我们可以在本地文件系统上重现它,如下所示:
设置场景,目录树位于
/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
请注意,作为普通用户,我们没有权限执行以下操作
/tmp/top/*/dir
:find /tmp/top/?/dir -type f find: ‘/tmp/top/a/dir’: Permission denied find: ‘/tmp/top/b/dir’: Permission denied
尝试从我们的目录中以 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
该路径不存在,因此出现错误。尝试使用 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 {} \;"