dirを使用してフォルダ内のすべてのシンボリックリンク、ジャンクションポイント、ハードリンクを表示するにはどうすればよいですか?


30

コマンドdir / aは、指定された場所にあるすべてのファイル、フォルダーのリストを表示します。ただし、ジャンクションポイントのタイプとフォルダーへのシンボリックリンクは表示されます。これらのどれがジャンクションポイントで、どれがシンボリックリンクであり、どのファイルがハードリンクであるかを区別して教えてくれるコマンドはありますか?

回答:


18

SysInternalsのjunction.exeを使用しないのはなぜですか?特定のフォルダーまたはそのサブフォルダー内のすべてのジャンクションをリストできます。

ウェブサイトから:

前書き

Windows 2000以降は、ディレクトリシンボリックリンクをサポートします。このディレクトリでは、コンピューター上の別のディレクトリへのシンボリックリンクとして機能します。たとえば、ディレクトリD:\ SYMLINKがターゲットとしてC:\ WINNT \ SYSTEM32を指定した場合、D:\ SYMLINK \ DRIVERSにアクセスするアプリケーションは、実際にはC:\ WINNT \ SYSTEM32 \ DRIVERSにアクセスします。ディレクトリシンボリックリンクは、WindowsではNTFSジャンクションとして知られています。残念ながら、Windowsにはジャンクションを作成するためのツールが付属していません。ジャンクションを作成するためのリンクプログラムに付属しているWin2Kリソースキットを購入する必要があります。そのため、独自のジャンクション作成ツールであるジャンクションを作成することにしました。ジャンクションでは、NTFSジャンクションを作成できるだけでなく、ファイルまたはディレクトリが実際に再解析ポイントであるかどうかを確認できます。再解析ポイントは、NTFSジャンクションが基づくメカニズムです。

ジャンクションの使用に関するヒントについては、このMicrosoft KB記事をお読みください。

Windowsは、リモート共有上のディレクトリへのジャンクションをサポートしていないことに注意してください。

再解析情報を表示する場合、ジャンクションの使用法は次のとおりです。

ジャンクションの使用

junctionを使用してjunctionをリストします。

使用法:[-s]

-s再帰サブディレクトリ

例:

ファイルがジャンクションかどうかを判断するには、ファイル名を指定します。

ジャンクションc:\ test

ディレクトリの下のジャンクションをリストするには、-sスイッチを含めます。

junction -sc:\

「c:\ Program Files」のジャンクションc:\ Program-Filesを作成するには:

C:> md Program-Files

C:>ジャンクションc:\ Program-Files "c:\ Program Files"

ジャンクションを削除するには、-dスイッチを使用します。

junction -dc:\ Program-Files


1
「ジャンクション」は、シンボリックリンクとジャンクションポイントを識別できます。ありがとう。ハードリンクは識別しません。どのコマンドを使用すると、ハードリンクするすべてのファイル/ファイル名のリストが表示されます。あるいは、ファイルのリンク数を取得する方法はありますか?ファイルのリンクカウントは、そのハードリンクの数に対応することを知っています。
ディワカールラビクマール14

2
あなたはハードリンクを検出するために、各ファイルの上にFSUTIL火災になりますserverfault.com/questions/319134/...
ガネーシュR.

49

ジャンクション、シンボリックリンク、ハードリンクを一覧表示するために追加のプログラムをダウンロードする必要は必ずしもありませんが、特定の出力形式の要件がある場合は、それらが役立つ場合があります。

現在のディレクトリとそのサブディレクトリ内のすべてのジャンクション、シンボリックリンク、およびシンボリックリンクディレクトリを一覧表示します。

dir /al /s

または、それらを個別にリストする場合...

現在のディレクトリとそのサブディレクトリ内のすべてのジャンクションをリストします。

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

現在のディレクトリとそのサブディレクトリ内のすべてのシンボリックリンクを一覧表示します。

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

現在のディレクトリとそのサブディレクトリ内のすべてのsymlinkディレクトリをリストします。

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

ここではl属性フラグが重要です。lですReparse Points(ジャンクション、シンボリックリンクとシンボリックリンクのディレクトリ)

ハードリンク

残念ながらdir、ハードリンクは通常のファイルとしてリストされているため、ハードリンクを識別するために使用することはできません。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再帰サブディレクトリオプション(/s)を使用すると、CPUに負荷がかかり、完了するまでに時間がかかりました。
  • fsutil基本的に二回実行して終了。各呼び出しによって返された出力行の数をカウントしてハードリンクを識別するのは1回目、出力を正しくするために見つかったばかりのハードリンクについては2回目です。
  • 行が重複します。それらを排除するには、出力をファイルにリダイレクトしてから、などのツールを使用してファイルを実行しますuniq

forハードリンクを識別するためだけに使用するバッチファイルを次に示します。などがforfiles関与していない、それはわずかに速くすることができるが、それはまだ上記ワンライナーの残りの警告を受けます。

@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%

MicrosoftのSFUAユーティリティツールキットに付属する代替の検索コマンドを使用します

find . -links +1

上記と同様の方法でSysinternalsのfindlinksユーティリティを使用しますfsutil

Uwe SieberのListLinksプログラムを使用-使用方法についてはリンクを参照

GUIアプリケーションを使用する場合は、NirsoftのNTFSLinksViewを使用します


Windows 7では、dir / al / sはシンボリックリンクディレクトリを表示しません
jaylweb

@jaylweb(1)dir / al / sはすべての再解析ポイントをリストします。シンボリックリンクディレクトリのみをリストするための私の答えをさらに参照してください。(2)あなたは間違っています、これは質問に答えます。
ジムダイン

11

Powershell 5以降では、次の1ライナーは、すべてのファイルハードリンク、ディレクトリジャンクション、シンボリックリンク、およびそのターゲットを再帰的にリストします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"} }

sayでこのスクリプトを実行するには、管理者権限が必要な場合があります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\" } }"

ジャンクションを表示するためにこれをどのように変更しますか?PowerShellコマンドについてはあまり詳しくありません。
J.スコットエルブライン

1
@ J.ScottElbleindir 'd:\Temp' -recurse -force | ?{$_.LinkType -eq "Junction"} | select FullName,LinkType,Target
アントン・クルーグロフ

LinkType再解析ポイントに対して信頼できるとは思われません。たとえば、PS 5.1でW10を実行しているコンピューターでLinkTypeは、「C:\ ProgramData \ Desktop」と「C:\ Users \ All Users」の両方でnullですが、dir /aL(PowerShellではなくコマンドプロンプト)は最初が接続点であることを示します2番目はシンボリックリンクです。
NewSites

@NewSitesはpoweshellを昇格させていますか?
アントンクルーグロフ

はい、PS ISEを管理者として実行しています。
NewSites

3

ハードリンクは上記のように説明する方が適切ですが、シンボリックリンクとジャンクションの場合、次のようにうまく機能します。

ここでは新しいコマンドを使用していませんが、見つかった各リンク、パス、タイプ(SymLink / Junction)、およびリンクパスとターゲットパスの両方の素敵なリストを表示することにより、いくつかのリストを改善します。

上にいくつかの良いものがありますが、それらはターゲットパスのみを提供し、通常はターゲットではなくリンクを削除するか、すべてのリンクとターゲットを関連付けます。

タイプ、リンク、およびターゲットを取得するには、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では、ファイルやディレクトリとは異なるシンボリックリンクとジャンクションポイントを検索して表示できます。(他にも多くのことができます。)ハードリンクを検索することもできます。

ALT+ F7=> [x]フィルターを使用=> Filt er =>Ins

必要な属性を選択します。


0

LinkMagic2.exe(ジャンクションリストマジック)も適しています。

c:\user2年前にWindows 7を最初にインストールしたときに、プリントフード、ネットフード、アプリケーションデータなどのすべてのジャンクションリンクを誤って削除しました。彼らが本当に目的としているのは後方互換性であり、インターネットを検索しているときに、これらの接続点なしで特定のことをしようとするのに苦労している人がいます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.