Bagaimana cara melihat semua tautan Simbolik, titik Persimpangan, tautan Keras dalam Folder menggunakan dir?

30

Perintah dir / a menampilkan daftar semua file, folder di lokasi tertentu. Tetapi ini menampilkan tipe untuk Junction Points dan juga Symbolic Links to Folders. Apakah ada perintah yang akan membedakan dan memberi tahu saya mana yang merupakan Poin Persimpangan dan mana yang merupakan tautan Simbolik serta mana dari file-file tersebut yang merupakan tautan keras?

Dhiwakar Ravikumar
sumber

Jawaban:

18

Mengapa tidak menggunakan junction.exe dari SysInternals? Ini memungkinkan Anda untuk membuat daftar semua persimpangan di folder tertentu atau sub foldernya.

Dari situs web:

pengantar

Windows 2000 dan yang lebih tinggi mendukung tautan simbolik direktori, di mana direktori berfungsi sebagai tautan simbolik ke direktori lain di komputer. Misalnya, jika direktori D: \ SYMLINK menentukan C: \ WINNT \ SYSTEM32 sebagai targetnya, maka aplikasi yang mengakses D: \ SYMLINK \ DRIVERS akan mengakses C: \ WINNT \ SYSTEM32 \ DRIVERS. Tautan simbolik direktori dikenal sebagai persimpangan NTFS di Windows. Sayangnya, Windows tidak memiliki alat untuk membuat persimpangan — Anda harus membeli Kit Sumber Daya Win2K, yang dilengkapi dengan program linkd untuk membuat persimpangan. Karena itu saya memutuskan untuk menulis alat saya sendiri persimpangan: Junction. Junction tidak hanya memungkinkan Anda untuk membuat persimpangan NTFS, ini memungkinkan Anda untuk melihat apakah file atau direktori benar-benar titik reparse. Poin reparse adalah mekanisme yang menjadi dasar persimpangan NTFS,

Silakan baca artikel Microsoft KB ini untuk tips menggunakan persimpangan.

Perhatikan bahwa Windows tidak mendukung persimpangan ke direktori pada share jarak jauh.

Jika Anda ingin melihat informasi berulang, penggunaan untuk Junction adalah sebagai berikut:

Menggunakan Persimpangan

Gunakan persimpangan untuk daftar persimpangan:

Penggunaan: [-s]

subdirektori Perulangan -s

Contoh:

Untuk menentukan apakah file merupakan persimpangan, tentukan nama file:

persimpangan c: \ test

Untuk daftar persimpangan di bawah direktori, sertakan –s switch:

persimpangan -sc: \

Untuk membuat persimpangan c: \ Program-File untuk "c: \ Program Files":

C:> md Program-File

C:> persimpangan c: \ Program-File "c: \ Program Files"

Untuk menghapus persimpangan, gunakan –d switch:

junction -dc: \ Program-Files

Ganesh R.
sumber
1
"persimpangan" dapat mengidentifikasi Tautan Simbolik dan Poin Persimpangan. Terima kasih. Itu tidak mengidentifikasi tautan keras. Perintah apa yang akan memberi saya daftar semua file / nama file yang di-link. Atau apakah ada cara untuk mendapatkan jumlah tautan suatu file? Saya tahu bahwa jumlah tautan suatu file sesuai dengan berapa banyak tautan keras yang dimilikinya.
Dhiwakar Ravikumar
2
Anda harus menjalankan fsutil di atas setiap file untuk mendeteksi hardlinks serverfault.com/questions/319134/…
Ganesh R.
49

Anda tidak perlu mengunduh program tambahan untuk membuat daftar persimpangan, symlink, dan tautan keras, tetapi jika Anda memiliki persyaratan format output tertentu, mereka dapat membantu.

Daftar semua persimpangan, symlink dan direktori symlink di direktori saat ini dan subdirektori-nya:

dir /al /s

Atau jika Anda ingin mereka terdaftar secara terpisah ...

Daftar semua persimpangan di direktori saat ini dan subdirektori:

dir /al /s | findstr "<JUNCTION>"

Daftar semua symlink di direktori saat ini dan subdirektori-nya:

dir /al /s | findstr "<SYMLINK>"

Daftar semua direktori symlink di direktori saat ini dan subdirektori-nya:

dir /al /s | findstr "<SYMLINKD>"

The lAtribut bendera adalah kunci di sini; ladalah untuk Reparse Points(persimpangan, symlink dan direktori symlink)

Tautan keras

Sayangnya dirdaftar tautan keras sebagai file normal, jadi Anda tidak dapat menggunakannya untuk mengidentifikasi tautan keras. Anda yang menggunakan inbuilt fsutilsebagai gantinya. Itu perlu dijalankan dari prompt perintah yang ditinggikan.

Dengan fsutil, daftarkan semua tautan keras di direktori saat ini dan subdirektori-nya:

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.

One-liner ini tidak ideal, dan saya akan menyambut setiap perbaikan.

  • Menggunakan forfilesdengan opsi subdirektori berulang ( /s) memalu CPU saya, dan perlu waktu untuk menyelesaikannya.
  • Pada fsutildasarnya akhirnya berjalan dua kali; pertama kali mengidentifikasi tautan keras dengan menghitung jumlah jalur keluaran yang dihasilkan oleh setiap panggilan, dan yang kedua pada tautan keras yang baru saja ditemukan untuk mendapatkan hasil yang benar.
  • Akan ada garis duplikat. Untuk menghilangkannya, Anda ingin mengarahkan output ke file dan kemudian jalankan file melalui alat seperti uniq.

Berikut adalah file batch yang digunakan hanya foruntuk mengidentifikasi tautan keras. Karena forfilestidak terlibat, mungkin sedikit lebih cepat, namun masih menderita peringatan tersisa dari satu-liner di atas.

@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.       
  )
)

Ada beberapa opsi lain (yang belum diuji):

Gunakan utilitas Microsoft HL Scan (lama)

hlscan /dir %CD%

Gunakan perintah cari alternatif yang datang dengan toolkit utilitas SFUA Microsoft:

find . -links +1

Gunakan utilitas findlink Sysinternals dengan cara yang mirip dengan yang fsutildisebutkan di atas

Gunakan program ListLinks Uwe Sieber - lihat tautan untuk penggunaan

Gunakan Nirsoft's NTFSLinksView jika Anda lebih suka aplikasi GUI

Jimadine
sumber
Pada Windows 7, dir / al / s tidak menampilkan direktori symlink OP menandai Windows 7, oleh karena itu ini tidak menjawab pertanyaan OP.
jaylweb
@ jaylweb (1) dir / al / s mencantumkan semua poin reparse. Lihat lebih jauh ke bawah jawaban saya untuk daftar direktori symlink saja. (2) Anda salah, ini menjawab pertanyaan.
Jimadine
11

Pada Powershell 5+, one-liner berikut secara rekursif mencantumkan semua hardlink file, persimpangan direktori dan tautan simbolik dan targetnya mulai dari d:\Temp\:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,Target

Keluaran:

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}

Jika Anda peduli tentang banyak target untuk hardlink, gunakan variasi ini yang mencantumkan target yang dipisahkan dengan tab:

dir 'd:\Temp' -recurse -force | ?{$_.LinkType} | select FullName,LinkType,@{ Name="Targets"; Expression={$_.Target -join "`t"} }

Anda mungkin memerlukan hak administrator untuk menjalankan skrip ini pada say C:\.

Untuk menjalankan skrip ini dari baris perintah tradisional (cmd.exe):

PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "<PowerShell commands>"

Contohnya:

C:\>PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "dir 'd:\Temp' -recurse -force | ?{ $_.LinkType } | select FullName, LinkType, @{ Name = \"Targets\"; Expression = { $_.Target -join \"`t\" } }"
Anton Krouglov
sumber
Bagaimana Anda mengubahnya untuk hanya menunjukkan persimpangan? Saya tidak begitu akrab dengan perintah PowerShell.
J. Scott Elblein
1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
Anton Krouglov
LinkTypetampaknya tidak dapat diandalkan untuk poin reparse. Misalnya, di komputer saya yang menjalankan W10 dengan PS 5.1, LinkTypeadalah nol untuk "C: \ ProgramData \ Desktop" dan "C: \ Users \ All Users", sedangkan dir /aL(Prompt Perintah, bukan PowerShell) menunjukkan yang pertama adalah titik persimpangan dan yang kedua adalah tautan simbolik.
NewSites
@NewSites Anda menjalankan poweshell ditinggikan?
Anton Krouglov
Ya, menjalankan PS ISE sebagai admin.
NewSites
3

Tautan keras lebih baik dijelaskan seperti di atas, tetapi untuk Tautan Simbol dan Persinggungan yang berikut berfungsi dengan baik:

Saya tidak menggunakan perintah baru di sini, tetapi meningkatkan pada beberapa yang terdaftar dengan menunjukkan kepada Anda daftar yang bagus dari setiap tautan yang ditemukan, di jalurnya, ketik (SymLink / Junction) dan kedua jalur tautan dan jalur target.

Ada beberapa yang bagus di atas tetapi mereka hanya memberi Anda jalur TARGET, dan biasanya Anda ingin menghapus tautan, dan bukan target, atau menghubungkan semua tautan dan target.

Untuk mendapatkan Jenis, Tautan, dan Target, Anda dapat menggunakan yang berikut ini di 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" ) )

Contoh output:

SYMLINK: "G:\FTP\Root" → "G:\FTP\Data"
JUNCTION: "G:\FTP\Junctioned\BT\02" → "W:\FTPRoot\02"
Ben Personick
sumber
1

Far Manager 3.0 dapat mencari dan menampilkan symlink dan titik persimpangan sebagai berbeda dari file dan direktori. (Ia dapat melakukan banyak hal lain.) Ia juga dapat mencari tautan keras.

ALT+ F7=> [x] Gunakan filter => Filt er =>Ins

Pilih atribut yang Anda inginkan.

pengguna3603546
sumber
0

LinkMagic2.exe (Junction list magic) juga bagus.

Saya keliru menghapus semua c:\usertautan Junction saya , seperti printhood, nethood, dan data aplikasi ketika saya pertama kali menginstal windows 7 2 tahun yang lalu karena saya pikir mereka diletakkan di sana secara keliru oleh instalasi. Apa yang sebenarnya mereka lakukan adalah kompatibilitas ke belakang, dan saat mencari di internet saya melihat beberapa mengalami kesulitan ketika mencoba melakukan hal-hal tertentu tanpa titik persimpangan ini.

Jim
sumber