1

我有两个主要文件夹,它们在不同的驱动器中有很多子文件夹。必须为第二个文件夹中的所有文件创建符号链接到第一个文件夹。

C:\folderC>tree /f
C:.
├───folder1
│       file1.txt
│       file3.txt
│
└───folder2
        file1.txt
        file3.txt

D:\folderD>tree /f
D:.
├───folder1
│       file2.txt
│
└───folder2
        file2.txt

使用 2 个命令的结果:

C:\>mklink C:\folderC\folder1\file2.txt D:\folderD\folder1\file2.txt
symbolic link created for C:\folderC\folder1\file2.txt <<===>> D:\folderD\folder1\file2.txt

C:\>mklink C:\folderC\folder2\file2.txt D:\folderD\folder2\file2.txt
symbolic link created for C:\folderC\folder2\file2.txt <<===>> D:\folderD\folder2\file2.txt

C:.
├───folder1
│       file1.txt
│       file2.txt
│       file3.txt
│
└───folder2
        file1.txt
        file2.txt
        file3.txt

如何使用一些命令为所有文件创建它,而不是为每个文件手动编写代码?

PS:首先我想使用硬链接,但似乎不可能。

C:\>mklink /h C:\folderC\folder2\file2.txt D:\folderD\folder2\file2.txt
The system cannot move the file to a different disk drive.
4

3 回答 3

2

你可以试试这个链接:

function createSymbolicLinks ($source, $destination, [switch]$recurse) {
    Get-ChildItem $source -Recurse:$recurse | ? { !$_.PSISContainer } | % {
        $destpath = $_.Fullname -replace [regex]::Escape($source), $destination
        if(!(Test-Path (Split-Path $destpath))) {
            #Create missing subfolders
            New-Item (Split-Path $destpath) -ItemType Directory -Force | Out-Null
        }
        cmd /c mklink $destpath $($_.FullName) | Out-Null
    }
}

#Create symbolic links in c:\folderC for all files in d:\folderD(with recursive search)
createSymbolicLinks -source d:\folderD -destination c:\folderC -recurse

我相信如果相同的文件名已经存在于c:\folderc. 因此,如果您需要c:\folderc用来自 的符号链接替换文件d:\folderd,则需要对其进行扩展以删除现有文件。

更新:这只会降低一个级别的recurse选项。这不是最漂亮的解决方案,但它应该可以工作。

function createSymbolicLinks ($source, $destination, [switch]$recurse) {
    Get-ChildItem $source | % { 
        if($_.PSIsContainer -and $recurse) { 
            Get-ChildItem $_.FullName
        } else { 
            $_
        }
    } | ? { !$_.PSIsContainer } | % { 
        $destpath = $_.Fullname -replace [regex]::Escape($source), $destination
        if(!(Test-Path (Split-Path $destpath))) {
            #Create missing subfolders
            New-Item (Split-Path $destpath) -ItemType Directory -Force | Out-Null
        }
        cmd /c mklink $destpath $($_.FullName) | Out-Null
    }
}

#Create symbolic links in c:\folderC for all files in d:\folderD(with recursive search)
createSymbolicLinks -source d:\folderD -destination c:\folderC -recurse
于 2013-11-03T21:19:33.287 回答
2

另一种方式。在 .bat 文件中,我使用这个:

for /f "delims=" %%i in ('dir /b /s *.jpg *.jpeg *.png *.gif') do (
    name of link = a path to a folder + a number + %%~nxi
    mklink </h for hard links or nothing for symlinks> name of link "%%i" >> log.txt
)

解释:for /f... 在带有子文件夹的选定目录中循环,%%i是通过路径 (folder\subfolder\one_file.ext) 找到的文件的名称。
%%i~nxi是没有路径 ( n) 和范围 ( x) 的名称。 mklink 为它创建链接%%i 。我的问题不同。在 2 台计算机中,我可以浏览所有符号链接(所有文件夹和子文件夹),但在第三台计算机中,不完全是。但是通过硬链接,一切正常(使用mklink /H)请阅读我的问题的结尾。谢谢

于 2017-09-07T18:30:10.183 回答
1

PS:首先我想使用硬链接,但似乎不可能。

硬链接只能在同一个文件系统中使用:它们不能跨越不同的驱动器(包括使用重解析点来避免驱动器号时)。

其次,Windows 中的“符号链接”是一个外壳(即 Windows 资源管理器)人工制品。它们仅在应用程序使用 shell 命名空间(大多数不使用)时才起作用。

最好避免。

于 2013-11-03T15:26:40.317 回答