我有两个主文件夹,它们在不同的驱动器中有很多子文件夹。必须为第二个文件夹中的所有文件创建第一个文件的符号链接。
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.
答案 0 :(得分: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
答案 1 :(得分:1)
PS:首先我想使用硬链接,但似乎不可能。
硬链接只能在同一个文件系统中使用:它们不能跨越不同的驱动器(包括使用重新分析点以避免使用驱动器号)。
其次,Windows中的“符号链接”是一个shell(即Windows资源管理器)工件。它们只能在应用程序使用shell命名空间时使用(大多数情况下都没有)。
最好避免。
答案 2 :(得分:1)
其他方式。在.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
是使用path(folder \ subfolder \ one_file.ext)找到的文件的名称。
%%i~nxi
是没有路径(n
)和范围(x
)的名称。
mklink
打开了%%i
的链接
有用。我的问题不同。在2台计算机中,我可以浏览所有符号链接(所有文件夹和子文件夹),但在第三个,不完全是。但是通过硬链接,一切正常(mklink /H
)
请阅读我的问题的结尾。
感谢