コマンドdir / aは、指定された場所にあるすべてのファイル、フォルダーのリストを表示します。ただし、ジャンクションポイントのタイプとフォルダーへのシンボリックリンクは表示されます。これらのどれがジャンクションポイントで、どれがシンボリックリンクであり、どのファイルがハードリンクであるかを区別して教えてくれるコマンドはありますか?
コマンドdir / aは、指定された場所にあるすべてのファイル、フォルダーのリストを表示します。ただし、ジャンクションポイントのタイプとフォルダーへのシンボリックリンクは表示されます。これらのどれがジャンクションポイントで、どれがシンボリックリンクであり、どのファイルがハードリンクであるかを区別して教えてくれるコマンドはありますか?
回答:
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
ジャンクション、シンボリックリンク、ハードリンクを一覧表示するために追加のプログラムをダウンロードする必要は必ずしもありませんが、特定の出力形式の要件がある場合は、それらが役立つ場合があります。
現在のディレクトリとそのサブディレクトリ内のすべてのジャンクション、シンボリックリンク、およびシンボリックリンクディレクトリを一覧表示します。
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を使用します
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\" } }"
dir '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番目はシンボリックリンクです。
ハードリンクは上記のように説明する方が適切ですが、シンボリックリンクとジャンクションの場合、次のようにうまく機能します。
ここでは新しいコマンドを使用していませんが、見つかった各リンク、パス、タイプ(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では、ファイルやディレクトリとは異なるシンボリックリンクとジャンクションポイントを検索して表示できます。(他にも多くのことができます。)ハードリンクを検索することもできます。
ALT+ F7=> [x]フィルターを使用=> Filt er =>Ins
必要な属性を選択します。
LinkMagic2.exe(ジャンクションリストマジック)も適しています。
c:\user
2年前にWindows 7を最初にインストールしたときに、プリントフード、ネットフード、アプリケーションデータなどのすべてのジャンクションリンクを誤って削除しました。彼らが本当に目的としているのは後方互換性であり、インターネットを検索しているときに、これらの接続点なしで特定のことをしようとするのに苦労している人がいます。