找到 X 但排除这些?

找到 X 但排除这些?

原始发现在 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`),并在当前安装在那里的内容被卸载时删除它。

相关内容