我需要查找硬盘上仅包含(任意数量的)NULL 字节的所有文件。如何在 Windows 计算机上执行此操作。或者使用 Linux 工具实时 CD?
背景:
某些东西损坏了我硬盘上的许多文件。损坏的文件:
- 有他们的内容被替换为 NULL 字节,
- 与畸形发生之前的大小完全相同,
- 修改时间未改变
这很奇怪。我在 HTML/PHP 项目目录中找到了大约 40 个这样的文件。我无法确定发生这种情况的日期,但似乎发生在几周前,因为我的所有备份都包含这些格式错误的文件。我没有注意到这一点,因为我没有使用本地文件,而且我开发服务器上的远程副本没有问题,所以我正在处理的网站没有受到影响。
我已经从最新的 svn 提交中恢复了这些文件,但我不知道还有哪些其他文件受到了影响。
答案1
安装 TotalCommander 的 (免费) 版本,然后搜索所有包含 0x0 的文件(例如十次)。然后查看文件中真正包含的内容。
答案2
我遇到了同样的问题。我想知道 TotalCommander 中的 RegEx 是否适用于 SWilk,因为根据他们自己的支持论坛,TC 不支持在 RegEx 搜索中使用 \0: http://www.ghisler.ch/board/viewtopic.php?t=26512 (但对我来说它不起作用)。
我最终使用了 grepWin: http://stefanstools.sourceforge.net/grepWin.html
使用“RegEx Search”,搜索模式“\A\0+\Z”并确保检查限制(默认不包括二进制文件和大于 2000 KB 的文件)
答案3
我能够使用 power shell 脚本完成此操作。这可能不是编写代码的最优雅的方式,但它确实有效。它将列出任何没有内容或内容仅包含空值的文件。可以删除或更改 -TotalCount 值以读取整个文件或更多行。我最初的想法是,如果它们是换行符,那么内容就不仅仅是空值了。
$files = Get-ChildItem -Path c:\somepath\tostartfrom -Recurse -File
foreach ($f in $files){
$content = Get-Content -Path $f.FullName -TotalCount 10
if ($content -match '[\\x01-\\xFF]+') {
#do nothing as file has a valid character in it
}
else {Write-Output $f.FullName}
}
Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');