คำสั่งdir / aแสดงรายการไฟล์ทั้งหมด, โฟลเดอร์ในตำแหน่งที่กำหนด แต่จะแสดงประเภทของจุดเชื่อมต่อรวมถึง Symbolic Links to Folders มีคำสั่งใดบ้างที่จะบอกความแตกต่างและบอกฉันว่าสิ่งเหล่านี้คือจุดเชื่อมต่อและลิงก์สัญลักษณ์ใดรวมถึงไฟล์ใดที่ลิงก์ยาก
คำสั่งdir / aแสดงรายการไฟล์ทั้งหมด, โฟลเดอร์ในตำแหน่งที่กำหนด แต่จะแสดงประเภทของจุดเชื่อมต่อรวมถึง Symbolic Links to Folders มีคำสั่งใดบ้างที่จะบอกความแตกต่างและบอกฉันว่าสิ่งเหล่านี้คือจุดเชื่อมต่อและลิงก์สัญลักษณ์ใดรวมถึงไฟล์ใดที่ลิงก์ยาก
คำตอบ:
ทำไมไม่ใช้junction.exeจาก SysInternals ช่วยให้คุณสามารถแสดงรายการแยกทั้งหมดในโฟลเดอร์เฉพาะหรือโฟลเดอร์ย่อย
จากเว็บไซต์:
บทนำ
Windows 2000 และสูงกว่ารองรับการเชื่อมโยงสัญลักษณ์ไดเรกทอรีซึ่งไดเรกทอรีทำหน้าที่เป็นลิงค์สัญลักษณ์ไปยังไดเรกทอรีอื่นบนคอมพิวเตอร์ ตัวอย่างเช่นหากไดเรกทอรี D: \ SYMLINK ระบุ C: \ WINNT \ SYSTEM32 เป็นเป้าหมายของมันแอปพลิเคชันที่เข้าถึง D: \ SYMLINK \ DRIVERS จะเข้าถึง C: \ WINNT \ SYSTEM32 \ DRIVERS ในความเป็นจริง ลิงก์สัญลักษณ์ของไดเรกทอรีนั้นรู้จักกันในชื่อ junctions NTFS ใน Windows น่าเสียดายที่ Windows มาพร้อมกับไม่มีเครื่องมือสำหรับการสร้างจุดเชื่อมต่อ - คุณต้องซื้อ Win2K Resource Kit ซึ่งมาพร้อมกับโปรแกรม linkd สำหรับสร้างจุดแยก ฉันจึงตัดสินใจเขียนเครื่องมือสร้างจังก์ชันของฉันเอง: จังก์ชัน Junction ไม่เพียง แต่ช่วยให้คุณสามารถสร้างจุดเชื่อมต่อ NTFS ได้ แต่ยังช่วยให้คุณดูว่าไฟล์หรือไดเรกทอรีเป็นจุดแยกวิเคราะห์ใหม่หรือไม่ จุดแยกวิเคราะห์ใหม่เป็นกลไกที่ใช้จุดแยก NTFS
โปรดอ่านบทความ Microsoft KB นี้สำหรับเคล็ดลับในการใช้ทางแยก
Notethat Windows ไม่รองรับการแยกไดเรกทอรีในส่วนแบ่งระยะไกล
หากคุณต้องการดูข้อมูลแยกวิเคราะห์ใหม่การใช้ Junction มีดังต่อไปนี้:
ใช้ทางแยก
ใช้ทางแยกเพื่อแสดงรายการทางแยก:
การใช้งาน: [-s]
-s Recurse ไดเรกทอรีย่อย
ตัวอย่าง:
ในการพิจารณาว่าไฟล์เป็นทางแยกให้ระบุชื่อไฟล์:
ทางแยก c: \ test
หากต้องการแสดงจุดเชื่อมต่อใต้ไดเรกทอรีให้รวมสวิตช์ –s:
ทางแยก -sc: \
วิธีสร้างจุดเชื่อมต่อ c: \ Program-Files สำหรับ "c: \ Program Files":
C:> md โปรแกรมไฟล์
C:> junction c: \ Program-Files "c: \ Program Files"
หากต้องการลบทางแยกให้ใช้สวิตช์ –d:
junction -dc: \ Program-Files
คุณไม่จำเป็นต้องดาวน์โหลดโปรแกรมเพิ่มเติมเพื่อแสดงจุดเชื่อมต่อสัญลักษณ์เชื่อมโยงและฮาร์ดลิงก์ แต่ถ้าคุณมีข้อกำหนดรูปแบบผลลัพธ์เฉพาะโปรแกรมเหล่านั้นอาจช่วยได้
แสดงรายการ junctions, symlinks และ symlink ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย:
dir /al /s
หรือถ้าคุณต้องการให้พวกเขาแสดงรายการแยกกัน ...
แสดงรายการทางแยกทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย:
dir /al /s | findstr "<JUNCTION>"
รายการ symlink ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย:
dir /al /s | findstr "<SYMLINK>"
รายการไดเรกทอรี symlink ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย:
dir /al /s | findstr "<SYMLINKD>"
การl
ตั้งค่าสถานะเป็นคีย์ที่นี่ l
ใช้สำหรับReparse Points
(junctions, symlink และไดเรกทอรี symlink)
ลิงก์ถาวร
แต่น่าเสียดายที่dir
แสดงรายการฮาร์ดลิงก์เป็นไฟล์ปกติดังนั้นคุณจึงไม่สามารถใช้เพื่อระบุฮาร์ดลิงก์ คุณใช้ inbuilt fsutil
แทน จำเป็นต้องเรียกใช้จากพรอมต์คำสั่งที่ยกระดับ
ด้วยfsutil
รายการฮาร์ดลิงก์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย:
for /F "usebackq tokens=2* delims=:" %G in (`forfiles /s /c "cmd /c fsutil hardlink list @path | findstr /n .* | findstr /b /v 1"`) do @fsutil hardlink list "%G" & echo.
หนึ่งซับนี้ไม่เหมาะและฉันยินดีต้อนรับการปรับปรุงใด ๆ
forfiles
กับตัวเลือกไดเรกทอรีย่อย recurse ( /s
) ตอกย้ำ CPU ของฉันและใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์fsutil
พื้นปลายการทำงานสอง; ครั้งแรกในการระบุฮาร์ดลิงก์โดยนับจำนวนบรรทัดเอาต์พุตที่ส่งคืนโดยการโทรแต่ละครั้งและครั้งที่สองบนฮาร์ดลิงก์ที่เพิ่งพบเพื่อรับเอาต์พุตที่ถูกต้องuniq
เพื่อขจัดพวกเขาที่คุณต้องการที่จะเปลี่ยนเส้นทางออกไปยังไฟล์และเรียกใช้ไฟล์ผ่านเครื่องมือเช่นต่อไปนี้เป็นไฟล์แบทช์ที่ใช้for
เพื่อระบุฮาร์ดลิงก์ เนื่องจากforfiles
ไม่เกี่ยวข้องกับมันอาจเร็วขึ้นเล็กน้อย แต่ก็ยังคงทนทุกข์ทรมาน caveats ที่เหลืออยู่ของซับหนึ่งข้างต้น
@echo off
AT > NUL
if %ERRORLEVEL% NEQ 0 echo You need to run this script from an elevated command prompt. Exiting. && exit /B 1
for /R "%CD%" %%a IN (*.*) do (
for /F "usebackq tokens=2* delims=:" %%b in (`fsutil hardlink list "%%a" ^| findstr /n .* ^| findstr /b /v 1`) do (
fsutil hardlink list "%%b"
REM The following echo command breaks up each group of hard links with a blank line
echo.
)
)
มีตัวเลือกอื่น ๆ (ยังไม่ทดลอง) สองสามตัว:
ใช้ยูทิลิตี้Microsoft HL Scan (เก่า)
hlscan /dir %CD%
ใช้คำสั่งค้นหาทางเลือกที่มาพร้อมกับชุดเครื่องมืออรรถประโยชน์ของ SFUA ของ Microsoft:
find . -links +1
ใช้ยูทิลิตีfindlinksของ Sysinternals ในลักษณะเดียวกันกับที่fsutil
กล่าวถึงข้างต้น
ใช้โปรแกรมListLinksของ Uwe Sieber - ดูลิงค์สำหรับการใช้งาน
ใช้NTFSLinksViewของ Nirsoft หากคุณต้องการแอพพลิเคชัน GUI
ตั้งแต่ Powershell 5+ หนึ่งซับต่อไปนี้จะแสดงรายการลิงก์ไฟล์ทั้งหมดการแยกไดเรกทอรีและลิงก์สัญลักษณ์และเป้าหมายเริ่มต้นจากd:\Temp\
:
dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target
เอาท์พุท:
FullName LinkType Target
-------- -------- ------
D:\Temp\MyJunctionDir Junction {D:\exp\junction_target_dir}
D:\Temp\MySymLinkDir SymbolicLink {D:\exp\symlink_target_dir}
D:\Temp\MyHardLinkFile.txt HardLink {D:\temp\MyHardLinkFile2.txt, D:\exp\hlink_target.xml}
D:\Temp\MyHardLinkFile2.txt HardLink {D:\temp\MyHardLinkFile.txt, D:\exp\hlink_target.xml}
D:\Temp\MySymLinkFile.txt SymbolicLink {..\exp\symlink_target.xml}
D:\Temp\MySymLinkDir\MySymLinkFile2.txt SymbolicLink {D:\temp\normal file.txt}
หากคุณสนใจเป้าหมายหลายรายการสำหรับฮาร์ดลิงก์ให้ใช้ชุดรูปแบบนี้ซึ่งแสดงรายการเป้าหมายที่คั่นด้วยแท็บ:
dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,@{ Name="Targets"; Expression={$_.Target -join "`t"} }
คุณอาจต้องการสิทธิ์ผู้ดูแลระบบเพื่อเรียกใช้สคริปต์C:\
นี้
เมื่อต้องการเรียกใช้สคริปต์เหล่านี้จากบรรทัดคำสั่งดั้งเดิม (cmd.exe):
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "<PowerShell commands>"
ตัวอย่างเช่น
C:\>PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "dir 'd:\Temp' -recurse -force | ?{ $_.LinkType } | select FullName, LinkType, @{ Name = \"Targets\"; Expression = { $_.Target -join \"`t\" } }"
dir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
LinkType
ไม่น่าเชื่อถือสำหรับจุดแยกวิเคราะห์ใหม่ ตัวอย่างเช่นบนคอมพิวเตอร์ของฉันที่รัน W10 ด้วย PS 5.1 LinkType
จะเป็นค่าว่างสำหรับทั้ง "C: \ ProgramData \ Desktop" และ "C: \ Users \ All Users" ในขณะที่dir /aL
(พรอมต์คำสั่งไม่ใช่ PowerShell) บ่งชี้ว่าจุดแรกคือจุดเชื่อมต่อ และลิงก์สัญลักษณ์ที่สอง
ลิงก์ถาวรอธิบายไว้ได้ดีกว่าข้างต้น แต่สำหรับ Symbolic Links and Junctions งานต่อไปนี้เป็นอย่างดี:
ฉันไม่ได้ใช้คำสั่งใหม่ใด ๆ ที่นี่ แต่จะปรับปรุงให้ดีขึ้นในบางรายการโดยแสดงรายการที่ดีของแต่ละลิงก์ที่พบในเส้นทางคือประเภท (SymLink / Junction) และทั้งเส้นทางลิงก์และเส้นทางเป้าหมาย
มีบางอย่างที่ดีข้างต้น แต่พวกเขาให้เส้นทางเป้าหมายเท่านั้นและโดยปกติคุณต้องการลบลิงก์ไม่ใช่เป้าหมายหรือเชื่อมโยงลิงก์และเป้าหมายทั้งหมด
FOR /F "Tokens=*" %A IN ('DIR /al /b /s G:\') DO @( for /F "Tokens=2,4 delims=<[]>" %B IN ('DIR /al "%~A"? ^| FIND /I " %~nA " ^| FIND /I "<" ^| FIND /I ">" ') DO @( ECHO.%~B: "%~A" → "%~C" ) )
SYMLINK: "G:\FTP\Root" → "G:\FTP\Data"
JUNCTION: "G:\FTP\Junctioned\BT\02" → "W:\FTPRoot\02"
Far Manager 3.0 สามารถค้นหาและแสดง symlink และ junction points ซึ่งแตกต่างจากไฟล์และไดเรกทอรี (มันสามารถทำสิ่งอื่น ๆ ได้มากมาย) นอกจากนี้ยังสามารถค้นหาลิงก์ได้ยาก
ALT+ F7=> [x] ใช้ตัวกรอง => Filt er =>Ins
เลือกคุณสมบัติที่คุณต้องการ
LinkMagic2.exe ( Magic Junction list) ก็ดีเช่นกัน
ฉันลบc:\user
Junction links ทั้งหมดของฉันอย่างผิดพลาดเช่น printhood, nethood และข้อมูลแอปพลิเคชันเมื่อฉันติดตั้ง windows ครั้งแรกเมื่อ 7 ปีที่แล้วเนื่องจากฉันคิดว่าพวกเขาติดตั้งผิดพลาด สิ่งที่พวกเขาใช้จริง ๆ ก็คือความเข้ากันได้แบบย้อนหลังและในขณะที่ค้นหาอินเทอร์เน็ตฉันเห็นว่าบางคนมีปัญหาในการพยายามทำบางสิ่งโดยไม่มีจุดเชื่อมต่อเหล่านี้