【问题标题】:Unix egrep looks into folder information?Unix egrep 查看文件夹信息?
【发布时间】:2012-07-10 20:51:54
【问题描述】:

我有一个简单的 egrep 命令,可以在当前目录中的所有文件中搜索包含“error”一词的行:

egrep -i "error" * 

此命令也将通过子目录。以下是整个文件夹的示例:

/Logfile_20120630_030000_ID1.log
/Logfile_20120630_030001_ID2.log
/Logfile_20120630_030005_ID3.log
/subfolder/Logfile_20120630_031000_Errors_A3.log
/subfolder/Logfile_20120630_031001_Errors_A3.log
/subfolder/Logfile_20120630_031002_Errors_A3.log
/subfolder/Logfile_20120630_031003_Errors_A3.log

顶层目录的日志文件包含“错误”行。但是“子文件夹”目录中的日志文件不包含带有“错误”的行。 (仅在文件名中)

所以我遇到的问题是 egrep 命令似乎正在查看“子文件夹”中的信息。我的结果是一大块似乎是二进制块,然后是顶部文件夹日志文件中包含单词“error”的文本行。

如果我删除了“子文件夹”下的所有文件,但没有删除文件夹本身,我会得到完全相同的结果。

那么 Unix 是否将文件历史信息保存在文件夹中?

问题已通过运行得到纠正: 寻找 。 -类型 f | egrep -i "错误" *

但我仍然不明白为什么会出现问题。我在 SunOS 上运行 C-shell。

【问题讨论】:

    标签: unix grep


    【解决方案1】:
    egrep -i error *
    

    * 元字符匹配任何文件名。目录也是文件。 * 由 shell 扩展为当前目录中的所有文件,这通常称为 globbing。

    set noglob
    

    关闭该行为。但是,您的目录中不太可能有名为 * 的文件,因此在此示例中,该命令将找不到任何类型的文件。顺便说一句 - 不要创建一个名为 * 的文件来测试它,因为名为 * 的文件可能会导致各种有趣和不需要的事情发生。想想当您尝试删除文件时会发生什么? rm '*' 将是正确的命令,但如果您或其他人不假思索地执行了 rm *,那么您就有问题了...

    【讨论】:

    • 感谢您的回复。我看到 egrep 如何将目录视为文件。我只是好奇究竟是什么记录了历史。
    • 我还注意到,当你有一个包含文件的目录,然后删除它下面的所有文件时,目录文件大小不会改变。我猜这与我上面提到的历史信息相同。我想更多地了解它在 Unix 中的工作原理。我猜测它与 inode 指针有关,但我认为这些指针在文件被删除时被删除。 ???
    • 文件确实被删除(如果没有更多链接,则释放 inode);没有保留专门的文件历史信息,只是目录条目仅标记为空闲,而名称不会被覆盖,因此它们保留在目录文件中,直到条目被重用。
    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2014-09-19
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多