特定のファイルのすべてのリンクを見つける方法
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コマンドオプションを使用する方法も学びました。