コマンドdir/aは、指定した場所にあるすべてのファイル、フォルダの一覧を表示します。しかし、それはジャンクションポイントのタイプとフォルダへのシンボリックリンクを表示します。これらのうちのどれがジャンクションポイントであり、どれがシンボリックリンクであり、どのファイルがハードリンクであるかを区別して教えてくれるコマンドはありますか?
SysInternalsの junction.exe を使用しないのはなぜですか。特定のフォルダまたはそのサブフォルダ内のすべてのジャンクションを一覧表示できます。
Webサイトから:
前書き
Windows 2000以降では、ディレクトリシンボリックリンクがサポートされています。ディレクトリは、コンピュータ上の別のディレクトリへのシンボリックリンクとして機能します。たとえば、ディレクトリD:\ SYMLINKがC:\ WINNT\SYSTEM32をターゲットとして指定している場合、実際にはD:\ SYMLINK\DRIVERSにアクセスするアプリケーションはC:\ WINNT\SYSTEM32\DRIVERSにアクセスします。ディレクトリシンボリックリンクは、WindowsではNTFSジャンクションとして知られています。残念ながら、Windowsにはジャンクションを作成するためのツールが付属していません - あなたはWin2Kリソースキットを購入しなければなりません。そこで私は自分自身の接合点作成ツールJunctionを書くことにしました。ジャンクションを使用すると、NTFSジャンクションを作成できるだけでなく、ファイルまたはディレクトリが実際に再解析ポイントであるかどうかを確認できます。再解析ポイントは、NTFSジャンクションの基盤となるメカニズムであり、ボリュームマウントポイントと同様にWindowsのRemote Storage Service(RSS)によって使用されます。
接合部を使用する上でのヒントについては、このMicrosoft KBの記事を読んでください。
Windowsはリモート共有上のディレクトリへのジャンクションをサポートしていません。
再解析情報を表示したい場合は、Junctionの使用法は次のとおりです。
ジャンクションを使う
Junctionを使用してjunctionをリストします。
使用方法:[-s]
-s再帰サブディレクトリ
例:
ファイルがジャンクションかどうかを判断するには、ファイル名を指定します。
ジャンクションc:\ test
ディレクトリの下にあるジャンクションを一覧表示するには、-sスイッチを含めます。
ジャンクション-s c:\
"c:\ Program Files"のジャンクションc:\ Program-Filesを作成するには
C:> mdプログラムファイル
C:>ジャンクションc:\ Program-Files "c:\ Program Files"
ジャンクションを削除するには、-dスイッチを使用します。
junction -d c:\ Program-Files
接合部、シンボリックリンク、およびハードリンクを一覧表示するために追加のプログラムをダウンロードする必要は必ずしもありませんが、特定の出力形式の要件がある場合は、それらが役立つ場合があります。
現在のディレクトリとそのサブディレクトリにあるすべてのjunction、symlink、およびsymlinkディレクトリを一覧表示します。
dir /al /s
あるいは、それらを別々にリストしたい場合は...
現在のディレクトリとそのサブディレクトリにあるすべてのjunctionをリストします。
dir /al /s | findstr "<JUNCTION>"
現在のディレクトリとそのサブディレクトリにあるすべてのシンボリックリンクを一覧表示します。
dir /al /s | findstr "<SYMLINK>"
現在のディレクトリとそのサブディレクトリにあるすべてのシンボリックリンクディレクトリを一覧表示します。
dir /al /s | findstr "<SYMLINKD>"
ここでl
属性フラグが重要です。 l
はReparse Points
(junction、symlink、symlinkディレクトリ)用です
ハードリンク
残念ながら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.
このワンライナーは理想的ではありません、そして私はどんな改善も歓迎します。
/s
)と一緒にforfiles
を使用すると、CPUに障害が発生し、完了までに時間がかかりました。fsutil
は基本的に2回実行されることになります。各呼び出しで返される出力行の数を数えることによってハードリンクを識別するための最初の時間と、出力を正しく取得するためにちょうど見つかったハードリンク上の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スキャン ユーティリティを使用する
hlscan /dir %CD%
MicrosoftのSFUAユーティリティツールキットに付属している代替 find コマンドを使用します。
find . -links +1
Sysinternalsの findlinks ユーティリティを上記のfsutil
と同じように使用します。
Uwe Sieberの ListLinks プログラムを使用してください。使用方法についてはリンクを参照してください。
あなたがGUIアプリケーションを好むならば、Nirsoftの NTFSLinksView を使ってください
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\" } }"
ハードリンクは上のように説明されていますが、シンボリックリンクとジャンクションでは次のようにうまく機能します。
ここでは新しいコマンドを使用していませんが、リストに表示されている各リンクのNiceリストをパスで表示し、その種類(SymLink/Junction)とLinkパスとターゲットパスの両方を表示することで改善します。
上にいくつかの良いものがありますが、それらはあなたにTARGETパスを与えるだけです、そして通常あなたはリンクを削除したいが、ターゲットは削除したくない、またはすべてのリンクとターゲットを相関させたいです。
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"
LinkMagic2.exe (ジャンクションリストマジック)もいいです。
2年前に最初にwindows 7をインストールしたとき、printhood、nethood、applicationデータなど、すべてのc:\user
Junctionリンクを誤って削除しました。インストールによって誤ってそこに置かれたと考えたためです。彼らが本当に求めているのは後方互換性であり、インターネットを検索しているうちに、これらの接続点を使わずに特定のことをやろうとしたときに困っている人もいます。
Far Manager 3.0では、ファイルやディレクトリとは異なり、シンボリックリンクやジャンクションポイントを検索して表示できます。ハードリンクも検索できます。
ALT+F7 => [x]フィルタを使う=> Filter => Ins
必要な属性を選択してください。