在 Linux 上查詢特定檔案的全部連結
概述
在本教程中,我們將學習如何在 Linux 上查詢特定檔案的全部連結。我們將使用 lsof 命令列出所有被任何程序開啟的檔案,然後使用 grep 命令過濾出僅與我們的目標檔案有連結的檔案。
什麼是連結?
在 Unix/Linux 系統中,連結是兩個不同檔案或目錄之間的關聯。建立連結時,它會為原始檔案或目錄建立一個新名稱。您可以透過其別名訪問連結檔案,而不是直接訪問原始檔案。例如,如果您建立一個名為“test”的符號連結指向 /home/user/Desktop/file1.txt,則可以使用 test 訪問檔案,而不是 Desktop/file1.txt。
設定
我們有一個 dir1 資料夾,並在其中放置了一個 file1.txt 文件。我們使用 ln 命令從不同的資料夾到文字文件和資料夾建立了多個符號連結。
[tpoint@server1:~/test]$ ls -lrth total 12K -rw-r--r-- 1 tpoint tpoint11 Jun 11 16:50 file1.txt drwxr-xr-x 4 tpoint tpoint4.0K Jun 11 16:50 dir1 [tpoint@server1:/tmp]$ ln -s ~tpoint/test/file1.txt filelink [tpoint@server1:/tmp]$ ln -s ~tpoint/test/dir1 dirlink [tpoint@server1:/tmp]$ ls -lrth total 49M lrwxrwxrwx 1 tpoint tpoint28 Jun 11 16:52 filelink -> /home/tpoint/test/file1.txt lrwxrwxrwx 1 tpoint tpoint28 Jun 11 16:52 dirlink -> /home/tpoint/test/dir1 ...
我們希望識別對映到 file1.txt 或 dir1 的所有連結。
您可以使用幾種不同的方法來實現這一點。現在,我們將詳細瞭解每一種方法。
使用find命令
find 選項允許您查詢文件中的所有連結。現在讓我們看看是否可以透過使用這兩個過濾器找到任何有用的連結目標。
按精確檔名查詢
要定位並跟隨所有名為 file1.txt 的超連結檔案,我們將 −L 選項新增到 grep 命令中 −
[tpoint@server1:~/test]$ find -L / -samefile file1.txt /home/tpoint/test/file1.txt /tmp/filelink /opt/filelink2 /srv/filelink3 find: ‘/etc/polkit-1/localauthority’: Permission denied
使用 −samefile 開關,我們將檔名或資料夾路徑新增到命令列。搜尋使用根 (/) 作為工作目錄在所有地方執行。
太好了!它起作用了。現在已經找到了所有 file1.txt 連結。
我們可以使用重定向將諸如許可權被拒絕之類的錯誤訊息傳送到 /dev/null。
[tpoint@server1:~/test]$ find -L / -samefile file1.txt 2> /dev/null /home/tpoint/test/file1.txt /tmp/filelink /opt/filelink2 /srv/filelink3
按 inode 編號查詢
在 Linux 檔案系統(例如 ext4)上工作時,它使用 inode 儲存有關檔案的資訊。我們透過列出其記憶體中位置(inode)來列出目錄中的檔案。每個 inode 都有多個連結,這些連結可以是符號連結或硬連結。我們可以透過檢視其 inode 來判斷檔案是否已被修改。
[tpoint@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 儲存在 inode 編號 94804 中。
讓我們使用帶“−inum”選項的“find”命令,該選項指的是我們要刪除的檔案的 inode。
[tpoint@server1:~/test]$ find -L / -inum 94804 2> /dev/null /home/tpoint/test/file1.txt /tmp/filelink /opt/filelink2 /srv/filelink3
已找到 file1.text 的所有連結。
透過遞迴方法查詢
−type 選項允許提供多個檔案型別規範。如果我們將型別指定為“小寫 L”,它將向我們顯示給定目錄中的所有軟連結。
[tpoint@server1:~/test]$ find / -type l /home/tpoint/test/dir1/certs/Buypass_Class_2_Root_CA.pem /home/tpoint/test/dir1/certs/3fb36b73.0 /home/tpoint/test/dir1/certs/0f5dc4f3.0 ...
然後,我們可以附加 -ls 選項以顯示每個連結的完整屬性。
[tpoint@server1:~/test]$ find / -type l -ls 2> /dev/null | more 94809 0 lrwxrwxrwx 1 tpoint tpoint 23 Jun 11 17:11 /tmp/dirlink -> /home/tpoint/test/dir1 94805 0 lrwxrwxrwx 1 tpoint tpoint 28 Jun 11 16:52 /srv/filelink -> /home/tpoint/test/file1.txt 94808 0 lrwxrwxrwx 1 tpoint tpoint 28 Jun 11 17:00 /tmp/filelink2 -> /home/tpoint/test/file1.txt 94810 0 lrwxrwxrwx 1 tpoint tpoint 24 Jun 11 17:11 /srv/dirlink2 -> /home/tpoint/test/dir1/ ...
最後,我們可以使用 `grep` 命令搜尋與特定檔名模式(file1.txt 或 dir/dir1)匹配的檔案。
[tpoint@server1:~/test]$ find / -type l -ls 2> /dev/null | grep dir1 94809 0 lrwxrwxrwx 1 tpoint tpoint 23 Jun 11 17:11 /tmp/dirlink -> /home/tpoint/test/dir1 94810 0 lrwxrwxrwx 1 tpoint tpoint 24 Jun 11 17:11 /srv/dirlink2 -> /home/tpoint/test/dir1/ ...
結論
在這裡,我們介紹了查詢檔案或目錄的所有硬連結的不同方法,以及如何使用 find 命令列引數來實現。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP