我正在尝试编写一个简单的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标记。我希望这是正确的。正如你所说的那样,当谈到这些东西时,我就是一个非常棒的人。
答案 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 找不到的内容 - 不确定这是否是你想要的......