如何使用硬链接复制同一 NTFS 驱动器上的文件夹?

如何使用硬链接复制同一 NTFS 驱动器上的文件夹?

有没有办法创建硬链接以在同一驱动器(NTFS 格式)上创建文件夹的副本?我希望执行类似这样的操作:XCOPY E:\TEMP\SAMPLE1* E:\TEMP\SAMPLE2\ /s 但实际上不是复制文件并使用额外的驱动器空间,而是创建指向文件的硬链接。

目标:SAMPLE2 文件夹中只有少数文件我们不需要,但希望将它们全部保留在 SAMPLE1 中。文件夹 SAMPLE2 最终将被复制到另一个驱动器。

注意:SAMPLE1 的总内容约为 400GB(其中包含多个子文件夹),而我们要从 SAMPLE2 中排除的每个文件约为 20-40MB(有很多,100 多个文件,位于各个子文件夹中)。

那么,除了使用硬链接之外,有没有办法执行与 XCOPY(上面的命令)等效的操作,然后我们去删除 SAMPLE2 中我们不需要的所有文件,然后再将它们复制到外部驱动器;然后删除 SAMPLE2 文件夹。

答案1

这有点像 hack,但是:

  1. 使用 GUI 进行常规完整复制。复制/粘贴等。观察磁盘空间消失。
  2. 运行 DupeGuru,将源设置为参考,将重复项设置为“正常”
  3. 报告完成后,执行“全选 > 删除”,然后勾选“重新创建为硬链接”选项。它也可以创建符号链接。您应该恢复一些磁盘空间。我有时会使用这个来准备一个文件夹,在使用脚本删除结构中的许多其他文件后上传。

额外福利:它可以在 Mac、Windows 和 Linux 上运行。太棒了!https://dupeguru.voltaicideas.net/ 在此处输入图片描述

答案2

无需第三方软件。这可以通过以下方式实现电源外壳。这是一个启用管道的函数,它采用源路径 ($Path) 和“镜像”路径 ($MirrorPath)。它使用源路径和子文件夹中文件的硬链接填充镜像路径,以匹配源子文件夹,这些子文件夹也是递归填充的。

Function Mirror-Path {
  Param(
    [Parameter(Mandatory,ValueFromPipeline,Position=0)]
    [String[]]
    $Path,
    [Parameter(Mandatory,Position=1)]
    [String]
    $MirrorPath
  )
  Begin{
    If ( ! ( Test-Path $MirrorPath )) {
        mkdir $MirrorPath -Force | out-null
    }
  }
  Process{ 
    ForEach ( $Target in $Path ) {
        If ( Test-Path $Target ) {
            Resolve-Path $Target | gci -File | ForEach {
                New-item -ItemType Hardlink -Path $MirrorPath -Name $_.Name -Target $_.FullName | out-null
            }
            Resolve-Path $Target | gci -Directory | ForEach {
                Mirror-Path $_.FullName ( Join-Path $MirrorPath $_.Name )
            }
        }
        Else {
            Echo "'$Target' is not a valid path."
        }
    }
  }
  End {}
}

答案3

理论上这很简单。您需要创建目录的符号链接,它将完全按照您的意愿执行操作。它将复制看起来和行为都像真实文件的快捷方式给用户和程序。然后,您可以删除不需要的符号链接,这只会删除链接;然后您可以像平常一样复制其余的“文件”(真正的链接),它将复制实际的文件。

但是 Windows 是基于 GUI 的,并且没有内置的 GUI 解决方案来创建符号链接。此外,命令提示符也使其变得困难。(如果您使用 Linux,则通过终端可以轻松直接地进行操作,并且某些图形文件管理器(如 GNOME Commander)也使通过 GUI 进行操作变得容易。)

因此...要执行上述解决方案,“简单”的方法是下载插件和支持文件(如果需要;阅读下载说明)这里 这将在您的右键菜单中添加符号链接选项。您需要的是“选择链接源”来“复制”目录,然后“拖放到硬链接克隆”来粘贴。在链接目录中按您想要的方式删除文件(链接)等。然后将其常规复制并粘贴(不是选择链接并拖放到)到您想要的任何位置,瞧,快捷方式就被复制为文件了!

最后,删除链接文件夹,就像什么都没有发生一样。

该插件似乎效果很好。试试吧!只需小心,只创建硬链接(无软链接或连接),并确保使用链接而不是实际文件!

现在,对于那些会提到 mklink 的人,以下是我在开发此答案时遇到的问题。通过以管理员身份运行的命令提示符使用 mklink(搜索 CMD 并右键单击并以管理员身份运行)应该可以正常工作...但对我来说却不是这样(如果你搜索的话,还有很多其他人也是如此)。即使通过 secpol.msc 修改权限后,我的访问仍然被拒绝。这似乎是一个普遍存在的问题。

答案4

链接外壳扩展

此实用程序向 Windows 资源管理器上下文菜单添加了一个 shell 扩展,允许拖放创建硬链接路口符号链接。它确实很老了,最早创建于 1999 年,但仍在更新,并且仍按预期运行。我相信这是最用户友好的解决方案。

示例图像

相关内容