web-dev-qa-db-ja.com

dirを使ってフォルダ内のすべてのシンボリックリンク、ジャンクションポイント、ハードリンクを表示する方法?

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

25

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

17
Ganesh R.

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

現在のディレクトリとそのサブディレクトリにあるすべてのjunction、symlink、およびsymlinkディレクトリを一覧表示します。

dir /al /s

あるいは、それらを別々にリストしたい場合は...

現在のディレクトリとそのサブディレクトリにあるすべてのjunctionをリストします。

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

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

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

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

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

ここでl属性フラグが重要です。 lReparse 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.

このワンライナーは理想的ではありません、そして私はどんな改善も歓迎します。

  • Recurse subdirectoriesオプション(/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 を使ってください

44
Jimadine

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\" } }"
9
Anton Krouglov

ハードリンクは上のように説明されていますが、シンボリックリンクとジャンクションでは次のようにうまく機能します。

ここでは新しいコマンドを使用していませんが、リストに表示されている各リンクのNiceリストをパスで表示し、その種類(SymLink/Junction)とLinkパスとターゲットパスの両方を表示することで改善します。

上にいくつかの良いものがありますが、それらはあなたにTARGETパスを与えるだけです、そして通常あなたはリンクを削除したいが、ターゲットは削除したくない、またはすべてのリンクとターゲットを相関させたいです。

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"
2
Ben Personick

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

2年前に最初にwindows 7をインストールしたとき、printhood、nethood、applicationデータなど、すべてのc:\user Junctionリンクを誤って削除しました。インストールによって誤ってそこに置かれたと考えたためです。彼らが本当に求めているのは後方互換性であり、インターネットを検索しているうちに、これらの接続点を使わずに特定のことをやろうとしたときに困っている人もいます。

0
Jim

Far Manager 3.0では、ファイルやディレクトリとは異なり、シンボリックリンクやジャンクションポイントを検索して表示できます。ハードリンクも検索できます。

ALT+F7 => [x]フィルタを使う=> Filter => Ins

必要な属性を選択してください。

0
user3603546