1. 概要

シンボリックリンクの作成を使用すると、ターゲットファイルが別のファイルシステムにある場合でも、ファイルに柔軟にアクセスできます。 場合によっては、ディスクスペースの問題をトラブルシューティングしたり、壊れた問題を修正したりするために、これらすべてのリンクを見つける必要があります。

このチュートリアルでは、特定のファイルのすべてのソフトリンクを見つける方法を見ていきます。

2. 設定

現在の作業ディレクトリの下にadir1ディレクトリとafile1.txtファイルがあるとします。 また、 ln コマンドを使用して、ファイルとディレクトリを指す複数のディレクトリに複数のシンボリックリンクを作成しました。

[mogamal@server1:~/test]$ ls -lrth
total 12K
-rw-r--r-- 1 mogamal mogamal   11 Jun 11 16:50 file1.txt
drwxr-xr-x 4 mogamal mogamal 4.0K Jun 11 16:50 dir1
[mogamal@server1:/tmp]$ ln -s ~mogamal/test/file1.txt filelink
[mogamal@server1:/tmp]$ ln -s ~mogamal/test/dir1 dirlink
[mogamal@server1:/tmp]$ ls -lrth
total 49M
lrwxrwxrwx 1 mogamal mogamal   28 Jun 11 16:52 filelink -> /home/mogamal/test/file1.txt
lrwxrwxrwx 1 mogamal mogamal   28 Jun 11 16:52 dirlink -> /home/mogamal/test/dir1
...

私たちの目標は、file1.txtとdir1にマップされたすべてのリンクを見つけることです。

それを達成するためのいくつかの方法があります。 次に、それらを詳しく見ていきましょう。

3. findコマンドの使用

find コマンドは、すべてのリンクを検索するための複数のオプションを提供します。 次に、これらのオプションを使用して、ターゲットファイルとディレクトリへのリンクを見つけてみましょう。

3.1. 正確なファイル名で検索

-Lおよび-samefileオプションをfindコマンドに追加することにより、file1.txtにマップされたすべてのリンクを検索して追跡できます。

[mogamal@server1:~/test]$ find -L / -samefile file1.txt
/home/mogamal/test/file1.txt
/tmp/filelink
/opt/filelink2
/srv/filelink3
find: ‘/etc/polkit-1/localauthority’: Permission denied

上記のように、オプション-同じファイルを使用して、ファイル名またはディレクトリを追加します。 ルートディレクトリ” /” を作業ディレクトリとして使用して、どこでも検索が実行されました。

良い、それは動作します。 すべてのfile1.txtリンクが見つかりました。

読みやすくするために、リダイレクトを使用して、「permissiondenied」などのエラーを / dev /nullスペースにリダイレクトできます。

[mogamal@server1:~/test]$ find -L / -samefile file1.txt 2> /dev/null
/home/mogamal/test/file1.txt
/tmp/filelink
/opt/filelink2
/srv/filelink3

3.2. iノード番号で検索

Linuxファイルシステムで作業する場合、 iノード番号を使用して、ファイルに関する情報を格納します。 フォルダ内のファイルを一覧表示すると、iノードへのリンクが表示されます。 iノードには複数のリンクを含めることができ、それらはシンボリックリンクまたはハードリンクにすることができます。 ファイルでstatを使用して、それがどのiノードを参照しているかを確認できます。

[mogamal@server1:~/test]$ stat file1.txt
  File: file1.txt
  Size: 11              Blocks: 8          IO Block: 4096   regular file
Device: 810h/2064d      Inode: 94804       Links: 1

このfile1.txtは、iノード94804を参照しています。

ファイルのiノードを参照する-inumアクションで、findコマンドを使用してみましょう。

[mogamal@server1:~/test]$ find -L / -inum 94804 2> /dev/null 
/home/mogamal/test/file1.txt 
/tmp/filelink
/opt/filelink2
/srv/filelink3

file1.txtのすべてのリンクが見つかりました。

3.3. 再帰的方法で検索

findコマンドは、複数のタイプを指定できる-typeオプションを提供します。 タイプをsmallL(リンクの場合はl)として指定すると、指定されたパス内のすべてのソフトリンクが表示されます。

[mogamal@server1:~/test]$ find / -type l
/home/mogamal/test/dir1/certs/Buypass_Class_2_Root_CA.pem
/home/mogamal/test/dir1/certs/3fb36b73.0
/home/mogamal/test/dir1/certs/0f5dc4f3.0
...

次に、 -ls オプションを追加して、リンクの完全な属性を一覧表示できます。

[mogamal@server1:~/test]$ find / -type l -ls 2> /dev/null | more
    94809      0 lrwxrwxrwx   1 mogamal  mogamal        23 Jun 11 17:11 /tmp/dirlink -> /home/mogamal/test/dir1
    94805      0 lrwxrwxrwx   1 mogamal  mogamal        28 Jun 11 16:52 /srv/filelink -> /home/mogamal/test/file1.txt
    94808      0 lrwxrwxrwx   1 mogamal  mogamal        28 Jun 11 17:00 /tmp/filelink2 -> /home/mogamal/test/file1.txt
    94810      0 lrwxrwxrwx   1 mogamal  mogamal        24 Jun 11 17:11 /srv/dirlink2 -> /home/mogamal/test/dir1/
...

最後に、 grep コマンドを使用して、file1.txtまたはdir1のファイル名パターンに一致させることができます。

[mogamal@server1:~/test]$ find / -type l -ls 2> /dev/null | grep dir1
    94809      0 lrwxrwxrwx   1 mogamal  mogamal        23 Jun 11 17:11 /tmp/dirlink -> /home/mogamal/test/dir1
    94810      0 lrwxrwxrwx   1 mogamal  mogamal        24 Jun 11 17:11 /srv/dirlink2 -> /home/mogamal/test/dir1/
...

4. 結論

この記事では、ファイルまたはディレクトリのすべてのソフトリンクを見つけるさまざまな方法を学びました。 また、それを実現するためにfindコマンドオプションを使用する方法も学びました。