我有一个 Perl 脚本,它需要删除一个包含所有内容的目录。有时,此目录包含到另一个目录的连接点。如果我rmtree()
天真,该rmtree()
调用还将删除路口目标文件夹内的所有文件。我正在寻找一种不这样做的方法,而只是移除连接点。
非 Perl 解决方案也将受到赞赏。
我刚刚在 Google 中输入了“连接点”并找到了访问 http://en.wikipedia.org/wiki/NTFS_junction_point的方法
命令提示符 (cmd.exe)
- Windows 2000 或更高版本中的 dir 命令可识别连接点,而不是在目录列表中显示(将 dir 与 /A 或 /AL 命令行开关一起使用)。
- 通常会影响普通目录中文件的任何命令在此处的作用相同。因此不应使用命令 del myjunction — 这只会删除目标目录中的所有文件。
- 命令 rmdir 和 move 可以很好地处理结点,但需要注意的是 move 不会让结点移动到另一个卷(与 Windows 资源管理器相反,如上所述)。
- rmdir 命令是安全的,因为它只删除连接点,而不是目标文件。在使用命令行界面浏览目录时,可以删除文件,但与资源管理器不同的是,也可以删除目录(例如使用 rmdir /s dirname。)
- 使用带有 /d 开关的链接命令是删除连接点的安全方法。
从我所看到的,例如,您可以使用dir
和 grep 输出<JUNCTION>
或使用 Windows rmdir
. 我认为您可以通过 Perl 使用其中的任何一个system
。
要找出重解析点(或“连接点”,如果您愿意的话)在哪里:
dir /a:l /b > myjunctions.txt
将显示当前目录中的所有重解析点。您可以添加 /s,但要注意重解析点内的重解析点也会被列出。
假设 myjunctions.txt 包含行 x:\subdir\foo。要删除它,您发出
fsutil reparsepoint "x:\subdir\foo"
瞧!您的连接点消失了,原始目录未受影响!
FastCopy 实用程序执行此操作:http: //ipmsg.org/tools/fastcopy.html.en
我正在使用此程序复制或删除可能包含作为子文件夹的联结的文件夹,以便保持联结目标不变。即使目标驱动器不同,连接点也会在复制时正确复制。
至少在 Windows 7 Ultimate 中,Windows 资源管理器在删除时也可以正常工作 - 连接目标保持不变。
但是在资源管理器中将包含联结的文件夹复制为子文件夹仍然无法按预期工作 - 它实际上做了一些我可能还不能完全描述的事情:联结文件夹似乎被复制为普通文件夹,但它们的内容是空的。