试图让grep从foreach循环中告诉我哪些值不存在

时间:2016-05-30 18:41:41

标签: unix foreach grep sh

我正在尝试编写一个简单的foreach循环,列出哪些文件存在以及哪些文件不在目录中。在这个例子中,让我们假设我们有一个名为def_456和ghi_789的文件的目录。如果我要做这样的事情:

foreach f (`xargs`)
abc
def
ghi
foreach$ ls /path/to/dir/* | grep $f
foreach$ end

我希望它吐出def_456 ghi_789,因为这个目录没有名为abc_123的文件。有没有办法让它让我知道abc_123丢失了?是否有一个标志我可以使用grep或其他东西来告诉我在foreach循环中的哪个列表不存在?

谢谢!

编辑希望更清楚地提出这个问题并删除bash标记并添加sh标记。我希望这是正确的。正如你所说的那样,当谈到这些东西时,我就是一个非常棒的人。

2 个答案:

答案 0 :(得分:1)

它不是grep,但comm实用程序可能很有用。它逐行比较两个排序的文件。如果您在名为a的文件中找到了要查找的文件列表,以及b中实际存在的文件列表,则可以执行comm a b

  

没有选项,[comm产生]三列输出。第一列包含FILE1特有的行,第二列包含FILE2特有的行,第三列包含两个文件共有的行。

如果隐藏其中两列,最终会得到一个简单列表。

comm -12 a b:仅打印文件共有的条目(隐藏第一列和第二列)

comm -13 a b:仅打印第二个文件唯一的条目(示例中为d f g s

comm -23 a b:只有第一个文件的唯一条目(示例中为a

当然,您可以使用Bash <(command)语法来读取命令而不是真实文件。它应该工作相同,如果需要,你可以轻松地使用| sort

答案 1 :(得分:0)

grep的返回代码会告诉你 - 如果$?在grep为0之后,你的grepped存在,如果它是1则不存在

所以

foreach f (`xargs`)
abc
def
ghi
foreach$ ls /path/to/dir/* | grep -q $f
foreach$ test $? -eq 1 && echo $f
foreach$ end

将还原输出 - 它应该打印 not 找不到的内容 - 不确定这是否是你想要的......