原始发现在 OS X 中有效,但现在在 Ubuntu 16.04 中无效
find $HOME -type f -name "*.tex" -exec grep -l "masi" {} + | vim -R -
(仍然是简化版本;您可以省略vim
部分,但它只是在这里显示我正在处理结果)
在 Ubuntu 16.04 中,我收到这些权限被拒绝的消息。我想从我的查找中排除权限被拒绝的消息;实际上这些文件似乎主要是 .dotFiles
drwx------ 2 root root 4096 touko 29 23:59 .gvfs
我无法结合代码我的搜索发现。因此,查找所有文件,但排除那些权限被拒绝 ( ! -readable -prune
) 的文件。伪代码
find $HOME -type f -name "*.tex" \
-o ! -readable -prune -o \
-exec grep -l "masi" {} +
但它似乎通过提供大量列表等消息来扩展太多
grep: /home/masi/.conda/envs/my_root/src/linux-headers-4.2.0-27/include/linux/power: Is a directory`
...
与 OS X 中的情况非常不同。我尝试-perm a+r
代替解析结构也没有成功,但我仍然收到那些权限被拒绝的消息。
回顾吉尔斯的回答
我的最终解决方案是
find $HOME +perm 0666 -type f -name ...
因为readable
它不是 POSIX 并且不能在 OSX 中工作。
如何在查找中将搜索和排除结合起来?
答案1
您提出的问题的答案与布尔代数和运算符优先级有关。你的find
命令如下:
- 如果它是常规文件,并且其名称匹配
*.tex
,则不执行任何操作。 - 否则,如果它不可读,则跳过它而不递归。
- 否则就跑
grep
。
首先进行可读性测试。这将导致与您感兴趣的文件匹配的测试附加到您要对其运行的命令。
find ~ ! -readable -prune -o \
-type f -name "*.tex" -exec grep -l "masi" {} +
或者,由于您似乎使用的是 Linux 和 OSX,因此可以使用 GNU grep 的递归工具。
grep -s -r --include='*.tex' -l 'masi' ~
您的主目录中不应该有不可读的文件。拥有属于 root 的文件表明您以 root 身份运行了某些程序(可能通过sudo
),并且它们留下了一些自动生成的状态文件或临时文件。
~/.gvfs
是 的根重力加速度传感器安装点层次结构,它绝对应该属于您,而不是 root,否则您尝试执行的 GVFS 安装(可移动媒体、网络驱动器等)将无法工作。跑步sudo rmdir ~/.gvfs
。如果您无法删除它,因为它仍在使用中,请将其移开(sudo mv ~/.gvfs
〜/.gvfs.root`),并在当前安装在那里的内容被卸载时删除它。