วิธีดูลิงก์สัญลักษณ์ทั้งหมดจุดเชื่อมต่อฮาร์ดลิงก์ในโฟลเดอร์โดยใช้ dir


30

คำสั่งdir / aแสดงรายการไฟล์ทั้งหมด, โฟลเดอร์ในตำแหน่งที่กำหนด แต่จะแสดงประเภทของจุดเชื่อมต่อรวมถึง Symbolic Links to Folders มีคำสั่งใดบ้างที่จะบอกความแตกต่างและบอกฉันว่าสิ่งเหล่านี้คือจุดเชื่อมต่อและลิงก์สัญลักษณ์ใดรวมถึงไฟล์ใดที่ลิงก์ยาก

คำตอบ:


18

ทำไมไม่ใช้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


1
"จังก์ชัน" สามารถระบุลิงก์สัญลักษณ์และจุดแยกได้ ขอบคุณ ไม่ได้ระบุลิงก์ที่ยาก คำสั่งอะไรจะให้รายชื่อไฟล์ / ชื่อไฟล์ทั้งหมดที่มีลิงค์ หรือมีวิธีรับจำนวนลิงค์ของไฟล์หรือไม่? ฉันรู้ว่าจำนวนลิงก์ของไฟล์สอดคล้องกับจำนวนลิงก์ที่มี
Dhiwakar Ravikumar

2
คุณจะต้องยิง fsutil บนแต่ละไฟล์เพื่อตรวจหา hardlinks serverfault.com/questions/319134/ …
Ganesh R.

49

คุณไม่จำเป็นต้องดาวน์โหลดโปรแกรมเพิ่มเติมเพื่อแสดงจุดเชื่อมต่อสัญลักษณ์เชื่อมโยงและฮาร์ดลิงก์ แต่ถ้าคุณมีข้อกำหนดรูปแบบผลลัพธ์เฉพาะโปรแกรมเหล่านั้นอาจช่วยได้

แสดงรายการ 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


ใน Windows 7 dir / al / s ไม่แสดงไดเรกทอรี symlink OP ที่ติดแท็ก Windows 7 ดังนั้นสิ่งนี้จะไม่ตอบคำถาม OPs
jaylweb

@jaylweb (1) dir / al / s แสดงรายการจุดแยกวิเคราะห์ใหม่ทั้งหมด ดูคำตอบของฉันเพิ่มเติมสำหรับการแสดงรายการไดเรกทอรี symlink เท่านั้น (2) คุณคิดผิดนี่จะตอบคำถาม
Jimadine

11

ตั้งแต่ 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\" } }"

คุณจะเปลี่ยนแปลงสิ่งนี้เพื่อแสดง Junctions ได้อย่างไร ฉันไม่คุ้นเคยกับคำสั่ง PowerShell
J. Scott Elblein

1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
Anton Krouglov

LinkTypeไม่น่าเชื่อถือสำหรับจุดแยกวิเคราะห์ใหม่ ตัวอย่างเช่นบนคอมพิวเตอร์ของฉันที่รัน W10 ด้วย PS 5.1 LinkTypeจะเป็นค่าว่างสำหรับทั้ง "C: \ ProgramData \ Desktop" และ "C: \ Users \ All Users" ในขณะที่dir /aL(พรอมต์คำสั่งไม่ใช่ PowerShell) บ่งชี้ว่าจุดแรกคือจุดเชื่อมต่อ และลิงก์สัญลักษณ์ที่สอง
NewSites

@NewSites คุณใช้ poweshell ยกระดับหรือไม่
Anton Krouglov

ใช่เรียกใช้ PS ISE ในฐานะผู้ดูแลระบบ
ไซต์ใหม่

3

ลิงก์ถาวรอธิบายไว้ได้ดีกว่าข้างต้น แต่สำหรับ Symbolic Links and Junctions งานต่อไปนี้เป็นอย่างดี:

ฉันไม่ได้ใช้คำสั่งใหม่ใด ๆ ที่นี่ แต่จะปรับปรุงให้ดีขึ้นในบางรายการโดยแสดงรายการที่ดีของแต่ละลิงก์ที่พบในเส้นทางคือประเภท (SymLink / Junction) และทั้งเส้นทางลิงก์และเส้นทางเป้าหมาย

มีบางอย่างที่ดีข้างต้น แต่พวกเขาให้เส้นทางเป้าหมายเท่านั้นและโดยปกติคุณต้องการลบลิงก์ไม่ใช่เป้าหมายหรือเชื่อมโยงลิงก์และเป้าหมายทั้งหมด

ในการรับ Type, Link และ Target คุณสามารถใช้สิ่งต่อไปนี้ใน CMD:

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"

1

Far Manager 3.0 สามารถค้นหาและแสดง symlink และ junction points ซึ่งแตกต่างจากไฟล์และไดเรกทอรี (มันสามารถทำสิ่งอื่น ๆ ได้มากมาย) นอกจากนี้ยังสามารถค้นหาลิงก์ได้ยาก

ALT+ F7=> [x] ใช้ตัวกรอง => Filt er =>Ins

เลือกคุณสมบัติที่คุณต้องการ


0

LinkMagic2.exe ( Magic Junction list) ก็ดีเช่นกัน

ฉันลบc:\userJunction links ทั้งหมดของฉันอย่างผิดพลาดเช่น printhood, nethood และข้อมูลแอปพลิเคชันเมื่อฉันติดตั้ง windows ครั้งแรกเมื่อ 7 ปีที่แล้วเนื่องจากฉันคิดว่าพวกเขาติดตั้งผิดพลาด สิ่งที่พวกเขาใช้จริง ๆ ก็คือความเข้ากันได้แบบย้อนหลังและในขณะที่ค้นหาอินเทอร์เน็ตฉันเห็นว่าบางคนมีปัญหาในการพยายามทำบางสิ่งโดยไม่มีจุดเชื่อมต่อเหล่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.