1

我运行代码给了我以下示例数据

md5deep find * | awk '{ print $1 }'

输出样本

    /Users/math/Documents/Articles/Number theory: Is a directory
    258fe6853b1bfb2d07f512ff6bec52b1
    /Users/math/Documents/Articles/Probability and statistics: Is a directory
    4811bfb2ad04b9f4318049c01ebb52ef
    8aae4ac3694658cf90005dbdea37b4d5
    258fe6853b1bfb2d07f512ff6bec52b1

我试图通过 SED过滤包含Is a directory的行未成功

md5deep find * | awk '{ print $1 }' | sed s/\/*//g

它的样本输出是

/Users/math/Documents/Articles/Number theory: Is a directory
/Users/math/Documents/Articles/Topology: Is a directory
/Users/math/Documents/Articles/useful: Is a directory

如何通过 SED/AWK 过滤掉包含“是目录”的每一行?

[澄清] 我想过滤掉包含Is a directory的行。

4

4 回答 4

2

我没有使用过该md5deep工具,但我相信这些行是错误消息;他们将进入标准错误而不是标准输出,因此他们将直接进入您的终端而不是通过管道。因此,您的 sed 命令不会过滤它们。您可以通过合并标准错误和标准输出流来过滤它们,但是

看起来(我不确定,因为您缺少反引号)您正在尝试调用

md5deep `find *`

并且 find 正在返回所有文件和目录。

关于您可能想要做的一些说明:

  • 看起来md5deep有一个 -r 表示“递归”选项。因此,您可能想尝试:

    md5deep -r *
    

    而不是 find 命令。

  • 如果您确实希望使用find命令,可以使用 将其限制为仅文件-type f,而不是文件和目录。此外,您不需要传递*到 find 命令(find如果文件的名称看起来像可以find理解的选项,这可能会造成混淆);传入.将递归搜索当前目录。

    find . -type f
    
  • 如果你想在sed你的模式中使用斜线,用 \ 正确引用它们可能会很痛苦。您可以改为选择不同的字符来分隔正则表达式;sed将使用s命令后的第一个字符作为分隔符。您的模式也缺少.; 在正则表达式中,表示您使用的任何字符的一个实例.,并表示您使用的“零个或多个前面的表达式” *,因此.*表示“零个或多个任何字符”(这与全局模式不同,其中*单独意思是“零个或多个任何字符”)。

    sed "s|/.*||g"
    
  • 如果您确实想在标准输出中包含标准错误流,那么它将通过管道,那么您可以运行:

    md5deep `find *` 2>&1 | awk ... 
    
  • 如果您只想忽略 stderr,可以将其重定向到/dev/null,这是一个特殊文件,它只会丢弃其中的任何内容:

    md5deep `find *` 2>/dev/null | awk ...
    

总之,我认为下面的命令将帮助您解决当前的问题,如果我没有理解您正在寻找的内容,上面列出的其他建议可能会对您有所帮助:

md5deep -r * | awk '{ print $1 }'
于 2009-03-24T19:12:56.833 回答
2

具体回答澄清:如何使用awk和sed过滤掉行:

awk '/Is a directory/ {next} {print}'
sed 'g/Is a directory/d'
于 2009-03-25T20:38:43.500 回答
1

为什么不使用 grep 代替?

IE,

md5deep find * | grep "Is a directory" | awk '{ print $1 }'

编辑:我只是重新阅读了您的问题,如果您想删除带有 Is a directory 的行,请使用 grep 的 -v 标志,即:

md5deep find * | grep -v "Is a directory" | awk '{ print $1 }'
于 2009-03-24T18:51:23.390 回答
0

我对 md5deep 不是很熟悉,但这可能会做一些你想做的事情。

find -type f -exec md5sum {} +
于 2009-03-24T19:00:08.643 回答