如何使用 Linux 工具压缩 NTFS 文件夹

如何使用 Linux 工具压缩 NTFS 文件夹

我遇到一个问题,我的 Windows 7C:\Windows\winsxs文件夹变得非常大(20GB),我想使用 Explorer 内置工具(文件夹属性 -> 高级 -> 压缩)对其进行压缩,但你知道,Windows 实际上不允许我这样做,因为这些 winsxs 文件受名为受信任的安装程序。所以我想在Linux上做。网上搜索到了一些关于ntfs-3g的提示,但是我找不到一个具体的例子来做NTFS文件夹压缩,所以我想在这里问一下。

假设我启动到了Knoppix Linux,并且Windows C:分区已经挂载到/mnt/winc,那么我应该使用什么命令来实现目标。

或者有没有不需要Linux环境的方法?

答案1

无需 Linux 即可实现,而且我总是在创建新安装后执行此操作。我刚刚使用 Windows 10 Enterprise 21H2 安装执行此操作,压缩后大小为 4.6GB。

我的做法是完成安装,然后重新启动安装介质(USB 或 DVD)。加载完成后,除非您尝试压缩需要驱动程序才能供安装程序使用的驱动器,否则无需继续实际安装对话框。您会知道您是否这样做,因为那时您已经在初始安装期间手动提供了驱动程序。如果您不明白,请忽略此部分并跳至下一段。如果您需要这样做,请继续安装步骤,直到选择要安装到的分区,您应该在其中加载驱动程序。

在任何一种情况下,按Shift+F10调出命令提示符。现在找出哪个驱动器是安装驱动器。它可能不会是 C:,因为它最有可能是安装程序驱动器。您必须从第一个驱动器开始并列出其内容,直到找到正确的驱动器。也就是说,键入C:并输入,然后dir输入,并检查输出。然后继续D:E:等等,直到找到它。您要查找的驱动器将包含“用户”和“Windows”以及“Program Files”文件夹等,如果您的计算机上安装了多个 Windows,您可以查看驱动器上报告的可用空间以猜测它是哪一个。在我最近的安装中,Windows 驱动器是驱动器 F。

确定驱动器后,您可以使用它compact.exe来压缩驱动器。您不必担心意外压缩不安全的文件,因为compact它会自动处理这个问题。例如,它不会压缩引导加载程序或页面文件。现在,最快捷但节省空间较少的方法是使用 Explorer(除了在此命令提示符中,您将压缩所有可以压缩的文件)。确保您已导航到要压缩的驱动器(在我最近的情况下是 F:),然后键入以下内容:

compact /c /i /s:\

/c只是意味着压缩。/i是忽略错误。您将收到错误,例如,您无法Documents and Settings在 Windows 10 中压缩,因为它实际上不是一个文件夹,而是一个指向的连接点Users。如果没有/icompact则会在出现此类错误后停止。/s:\意味着处理目录中的所有内容\(您所在的位置,即驱动器的根目录)以及其中的所有子目录。

如上所述,这种方式与 Explorer 中的方式完全相同,只不过它会压缩更多 Explorer 无法压缩的文件,因为您无法访问这些文件和/或这些文件正在使用中。在我当前的安装中,压缩率为 1.7:1。

但是,如果你想要更极端地节省空间,有一个标志,/exe它告诉compact使用更高效的压缩,这种压缩适用于一次写入多次读取的文件类型,通常是可执行文件(例如explorer.exe),因此得名。它将压缩全部但是,使用所选算法可以压缩文件,因此它可以节省所有文件的空间,而不仅仅是可执行文件。最有效的算法是lzx,当应用于我的安装时,压缩率为 2.4:1(实际上,我想说 2.7:1,但我记不太清楚,但它比默认的效率高得多)。但是,它需要您进行两次运行 - 分别是:

compact /c /i /f /exe:lzx /s:\

进而:

compact /c /i /s:\

好吧,你可能会问,为什么要运行两次。这是因为当你使用标志时,/exe你是在告诉compact使用 NTFS 默认不会应用的非标准压缩算法 - 你必须运行此命令才能使用该算法进行压缩。因此,它拒绝将文件夹标记为压缩,因为它无法自动使用 压缩新文件lzx,因此虽然第一个compact命令可以非常有效地压缩驱动器上的所有文件,但它会让所有文件夹没有压缩标志,这意味着任何新文件或更改的文件也不会被压缩。

注意额外添加的/f标志。如果驱动器上已经有一些压缩文件(可能压缩了 Documents 文件夹或类似的东西),这将强制使用算法重新压缩已压缩的文件lzx

第二个命令基本上与上面的第一个命令相同,但因为我们不强制/f压缩已经压缩的任何内容,所以这里的效果是它将跳过我们刚刚压缩的所有文件lzx,但将所有文件夹标记为压缩,以便将来新的和修改的文件也将自动压缩。

简而言之,第一个命令非常有效地压缩所有文件,第二个命令将所有文件夹标记为压缩,以便将来的文件也被压缩。

我应该指出,首先,并非所有 NTFS 实现都支持这种类型的压缩。例如,在我的 Linux Mint 20.2 Live 棒中,根本无法读取像这样压缩的文件。据我所知,较新版本的开源驱动程序支持读取ntfs-3g,但您的发行版中可能尚无法访问它。我也不知道新的ntfs3本机 Linux 驱动程序是否支持它。在 Microsoft 方面,似乎也可能只适用于 Windows 10 及更高版本,因此您可能无法从 Windows 7 或 8 读取这样的驱动器。其次,由于 Windows 不会使用这些更高效的算法自动压缩新文件和修改文件,请记住,将来修改的任何压缩文件都将使用效率较低的默认算法重新压缩。但是,如果您使用的是 Windows 10 或 Windows 11,则一切都会正常。这值得考虑。

希望这可以帮助 :)

附言:这当然可以在任何现有安装上随时完成,我在这里只是提到新安装,因为在新安装后立即执行此操作已经成为我的习惯。

编辑:在我完成设置我的新系统后,进行了一点更新,现在在启用 BitLocker 之前从 Windows 安装程序重新运行了所有这些。这里的方法是/lzx:exe先使用,然后再运行第二次以标记所有文件夹以进行压缩。这很有效(压缩后在系统驱动器上节省了额外的 4 GB(我首先使用了默认压缩算法,因为我想能够使用 Linux 修改文件系统,因此与默认压缩算法相比,这额外节省了 4 GB)),但我感到很困惑,因为我注意到在 Windows 资源管理器中很多文件看起来没有压缩。也就是说,它们没有颜色(我在视图设置中启用了“以颜色显示加密或压缩的 NTFS 文件”,但很多文件不是​​蓝色的)。我compact在管理命令提示符中乱搞了一番,无法更改这一点。然后我发现这其实只是典型的微软无能——Windows 资源管理器本身并不理解这些新的EXE压缩算法,所以它不会将文件显示为蓝色,如果你检查它们的属性,它也不会在高级下的压缩框中有一个复选标记。但是,它会在常规大小与磁盘大小中显示正确的大小,因此“已用空间”数字会更低。天哪!XD

答案2

步骤如下:

  1. 将目录标记为压缩
  2. 将文件移动到临时位置
  3. cp -a将文件返回到其原始目的地以触发压缩

(默认情况下,ntfs-3g 启用安装选项compression


# Mark a directory for compression
setfattr -h -v 0x00000800 -n system.ntfs_attrib_be directory-name

# On small-endian computers when above is not possible
setfattr -h -v 0x00080000 -n system.ntfs_attrib directory-name

但请注意以下警告(来自ntfs-3g页):

设置mount 选项后compression,在标记为压缩的目录中创建的文件将以压缩形式创建。当它们被移动(通过重命名)到同一卷中的常规目录时,它们仍保持压缩状态,并且移动后附加到它们的数据将被压缩。相反,在目录中标记为压缩之前存在的文件以及从未标记为压缩的目录中移动的文件不会被压缩。复制压缩文件始终会将其解压缩,如果目标目录标记为压缩,则只需再次压缩它即可。


对于新卷,请查看 -C中的选项mkfs.ntfs

相关内容