【问题标题】:Find Files with 0x00 content查找内容为 0x00 的文件
【发布时间】:2021-08-06 07:25:53
【问题描述】:

我正在寻找一种简单快速的方法来搜索仅包含 0x00 的文件。这是一个 8TB 硬盘,有些复制出错了。文件名和大小都可以,但它们只包含 0x00。我已经尝试使用带有\x00{100} 的wingrep ,但它会搜索整个文件并计算模式匹配的频率,这将花费太多时间。所以我写了一个简短的 C++ 程序,它只通过读取前 100 个字节来完成这项工作,但我很感兴趣如何使用正则表达式来告诉它应该只检查第一个匹配项,然后继续下一个文件?

谢谢 - 它适用于 `\A.*?\x00{100}。但这会在文件中找到所有匹配项 - 即使在最后。我已经查看但没有找到会限制搜索区域的标志(例如从索引 0 到索引 101)。好的 - 我已经在我的程序中完成了这项工作,但是否可以只使用正则表达式?

【问题讨论】:

  • 试试\A.*?\x00{100}
  • 请注意\A*? 是大多数grep 实现不支持可移植的Perl 扩展。如果您有 GNU grep,请尝试使用 grep -P 启用这些功能。
  • @tripleee OP 提到了wingrep(实际上是grepWin),它是基于.NET regex 库的。
  • 尝试启用“仅一个实例”复选框选项。

标签: regex windows grep


【解决方案1】:

当您使用grep 时,我想您的 Windows 计算机上有一个 Linux 子系统或 Cygwin,用于模拟 Linux 命令。

其中一个命令是 head,它只允许查看第一个 n 字节 (head -c) 或行 (head -n)。您可以将其用作grep 的输入。

【讨论】:

  • 他们说他们正在使用“wingrep”,但我不知道这个工具的功能是什么。
【解决方案2】:

grep -m 1 找到第一个匹配项并退出。 grep -l 在找到匹配项并打印文件名后同样退出。但如果你的任务真的是查找不包含任何其他内容的文件,我猜你想要grep -L '[^\x00]' (假设您有一个类似 GNU 的 grep,它支持 -L 选项和 \x00 十六进制转义)。

如果你有 Python,这里有一个简单的程序来检查你的所有文件。

from pathlib import Path

for file in Path('c:/').rglob('*'):
    if not file.is_file():
        continue
    try:
        with open(file, 'rb') as fh:
            found = False
            nonempty = False
            while not found:
                buf = fh.read(1024)
                for byte in buf:
                    nonempty = True
                    if byte != b'\x00':
                        found = True
                if len(buf) < 1024:
                    if not found and not nonempty:
                        print(file)
                    break
    except PermissionError as err:
        print(file, err)

nonempty检查是为了排除空文件,当然它根本不包含任何字节(主逻辑读取空字节并在找到不为空的字节时放弃)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 2015-07-23
    • 2012-02-17
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多