grep:/ proc / sysrq-trigger:input/输出错误

我正在search一个文件系统,并利用grep。 我发现一切正常,直到出现此错误:

Grep: /proc/sysrq-trigger: Input/output error 

我在网上的不同地方find了信息,其他人也遇到了同样的问题,但是没有任何地方可以实现。 我试过2> / dev / null,它抑制了错误,但没有“跳过文件”,这真的是我希望它会做的。 相反,它只是停止进程(这是一个利用grep的find / sed进程)。 我认为有一种方法来指定使用grep排除文件,但我希望有一个更强大和优雅的解决scheme。

这听起来好像你是递归搜索整个文件系统层次结构。 这在大多数系统上不会如预期那样工作。

在Linux上,至少/proc/sys是虚拟文件系统 – 它们不对应磁盘上的实际文件。 /dev中的特殊文件也不是实际文件 – 它们对应于系统中的某些设备,例如硬盘,输入设备等。修改 – 甚至偶尔读取 – 这些目录下的文件不应该发生在一个不受控制的方式,因为你可以崩溃内核,破坏你的文件系统,甚至造成对你的硬件的永久性损害。

由于您正在使用find来执行搜索,因此您需要限制其搜索的范围:

  • 使用显式否定的-path选项:

     find / -maxdepth 2 -type f ! -path '/proc/*' ! -path '/sys/*' 
  • 使用-prune选项:

     find / -maxdepth 2 -path '/proc' -prune -o -path '/sys' -prune -o -type f -print 
  • 使用-xdev选项可以避免完全降级到其他文件系统:

     find / -maxdepth 2 -xdev -type f 

您可以使用尽可能多的-path和/或-prune选项来微调find的输出。 不过,我建议你先检查一下它的输出,然后再把它传递给管道后期的任何一个阶段。

编辑:

以下是以非受控方式访问某些文件时造成的损坏的一些示例 – 通常以root身份进行:

  • 如果将/proc/kcore作为root读取,则较旧的内核会崩溃 。 我相信这种情况不会再发生了,但是在2.4.x内核系列中引入了/proc/kcore ,我又遇到了这个问题, 偶尔它会弹出来 ,所以我没有心情去测试它。

  • /dev/通过设备节点读取块设备会严重减慢该设备上的任何其他操作,因为它会绕过VFS和各种高速缓存。 想象一下,例如,直接读取一个6TB的RAID-5部分,而其他进程试图通过安装的文件系统正确使用它。 在find使用-type f应该防止发生这种情况。

  • 由于您提到了修改,因此可以通过破坏可通过/dev/mtd*访问的固件来轻松刷新嵌入式设备。 在某些情况下,如果没有一些非常极端的措施就不可能从这种腐败中恢复过来

grep有一个–exclude-dir = dir选项,可以用来避免/ proc和/ sys

我最近使用了一个像这样的命令,我只知道一个参数的名字,但我不知道文件的路径。

 cd / && grep -rI --exclude-dir=proc --exclude-dir=sys pattern *