了解复杂的查找命令

了解复杂的查找命令

当我遇到这个命令时,我正在清理以前的开发人员在Linux机器上创建的脚本代码:

find / -xdev -type f | egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs" | xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\  -f1

我试图完全弄清楚该命令的每个部分到底起什么作用,但是 grep 部分让我感到困惑。

我知道输出本质上是文件系统的校验和值,但我需要确切知道它是如何执行此操作的。

谢谢。

答案1

慢动作:

egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs"
  • egrep意味着我们正在使用 ERE(扩展正则表达式)
  • -v 反转选择(保留不匹配的内容)
  • |各种表达式进行“或”运算
  • ^是“行首”匹配

因此,它会删除以 等开头的行... /etc/shadow/etc/random-seed从而将文件从这些目录中排除。

因此从整体上来说:

  • 仅在文件系统中查找所有文件/(由于-xdev),因此这会排除/proc例如可能的其他文件系统(考虑到其余的,我不会惊讶于它/var是一个单独的 FS),并过滤掉特定的目录,如上所示。
  • 计算所有这些文件的 MD5 哈希值(xargs md5sum
  • 稍微调整一下哈希列表
  • 计算 MD5 哈希值列表的 MD5 哈希值md5sum | cut -d\ -f1

换句话说,它计算磁盘上所有文件的组合哈希值,可能是为了检查自上次计算以来是否没有任何变化(这就是为什么我会惊讶于 /var被考虑在内,因为它的内容会随着时间而变化:/var/log,,/var/mail... /var/lib

答案2

xenoid 的回答是有效的,所以我就不再重复了。由于 lukemk1 在上面关于这部分的评论中要求澄清一些问题,因此还需要澄清一些问题:| xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\ -f1

“| xargs md5sum”:允许您应用 md5sum 命令,其参数是所有管道文件名(这里可能有点复杂)。

“2> /dev/null” :表示丢弃 stderr 流

“| tr -s "[:space:]" ":(根据“man tr” [:space:] 表示所有水平或垂直空格,并且 -s 标志(--squeeze-repeats)挤压这种类型空格的连续重复。

“| md5sum” :获取 md5sum 流的 md5sum

“| cut -d\ -f1 ” :使用空格(“\”)作为分隔符字段,仅打印第一个字段(实际上只是 md5sum 数字)

这不是问题的一部分,但我发现整个命令的一个问题是,如果文件名中有空格,它将无法按预期工作;要纠正,您需要使用 find ... -print0 | ....| xargs -0 ....

相关内容