我正在尝试在特定位置查找一些大文件:
此命令有效并返回一些结果:
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 返回的结果与第一个命令不同?
失败的原因与权限和通配符有关*
。我们可以在本地文件系统上重现它,如下所示:
设置场景,目录树位于/tmp/top
:
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)请注意,作为普通用户,我们没有权限执行以下操作/tmp/top/*/dir
:
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)尝试使用 root 权限从普通用户无法访问的目录进行降序:
\n\nsudo 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
该路径不存在,因此出现错误。
尝试使用 root 权限从我们可以作为普通用户访问的目录进行降序:
\n\nsudo 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 子目录向下查找这些文件,并列出它发现的文件。
.local
在您的情况下,如果没有 root 权限,通配符路径中的目录很可能无法访问,但更高级别的目录是可以访问的。当您指定可被评估为普通用户帐户的路径时,可以find
继续处理扩展的路径集。一旦您指定了无法在普通用户帐户上下文中计算的路径,扩展就会失败,并find
传递一个包含文字*
字符的路径。这当然无法匹配,并且find
失败。
要解决此问题,您只需推迟对路径的评估,直到命令以 root 身份运行:
\n\nsudo bash -c "find /nfshome/*/.local/ -type f -size +1G -exec ls -lh {} \\;"\n
Run Code Online (Sandbox Code Playgroud)\n