Linux操作系統(tǒng)--文件查看(八)

1. head命令:顯示文件開頭的內(nèi)容

head 是用來顯示文件開頭的命令,其基本信息如下。
命令名稱:head。
英文原意:output the first part of files。
所在路徑:/usr/bin/head。
執(zhí)行權(quán)限:所有用戶。
功能描述:顯示文件開頭的內(nèi)容。
命令格式

[root@localhost ~]# head [選項(xiàng)]文件名

選項(xiàng):
-n 行數(shù): 從文件頭開始,顯示指定行數(shù);
-v:顯示文件名;
常見用法

[root@localhost ~]# head anaconda-ks.cfg

head 命令默認(rèn)顯示文件的開頭 10 行內(nèi)容。如果想顯示指定的行數(shù),則只需使用"-n"選項(xiàng)即可,例如:

[root@localhost ~]# head -n 20 anaconda-ks.cfg

這是顯示文件的開頭 20 行內(nèi)容,也可以直接寫"-行數(shù)",例如:

[root@localhost ~]# head -20 anaconda-ks.cfg

2. tail命令:顯示文件結(jié)尾的內(nèi)容

既然有顯示文件開頭的命令,就會(huì)有顯示文件結(jié)尾的命令——tail 命令。

tail 命令的基本信息如下:
命令名稱:tail。
英文原意:output the last part of files。
所在路徑:/usr/bin/tail。
執(zhí)行權(quán)限:所有用戶。
功能描述:顯示文件結(jié)尾的內(nèi)容。
命令格式

[root@localhost ~]#tail [選項(xiàng)] 文件名

選項(xiàng):
-n 行數(shù):從文條尾開始,顯示指定行數(shù)
-f:監(jiān)聽文件的新増內(nèi)容
常見用法
【例 1】基本用法。

[root@localhost ~]# tail anaconda-ks.cfg

tail 命令和 head 命令的格式基本一致,默認(rèn)會(huì)顯示文件的后 10 行。如果想顯示指定的行數(shù),則只需使用"-n"選項(xiàng)即可,例如:
[root@localhost ~]# tail -n 20 anaconda-ks.cfg

也可直接寫"-行數(shù)",例如:

[root@localhost ~]# tail -20 anaconda-ks.cfg

【例 2】 監(jiān)聽文件的新増內(nèi)容。
tail 命令有一種比較有趣的用法,可以使用"-f"選項(xiàng)來監(jiān)聽文件的新増內(nèi)容,例如:

[root@localhost ~]#tail -f anaconda-ks.cfg
@server-platform
@server-policy
pax
oddjob
sgpio
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite
%end
#光標(biāo)不會(huì)退出文件,而會(huì)一直監(jiān)聽在文件的結(jié)尾處

這條命令會(huì)顯示文件的最后 10 行內(nèi)容,而且光標(biāo)不會(huì)退出命令,而會(huì)一直監(jiān)聽文件的結(jié)尾處,等待顯示新増內(nèi)容。這時(shí)如果向文件中追加一些數(shù)據(jù)(需要開啟一個(gè)新終端),那么結(jié)果如下:

[root@localhost ~]# echo 2222222222 >> anaconda-ks.cfg
[root@localhost ~]# echo 3333333333 >> anaconda-ks.cfg
#在新終端中通過echo命令向文件中追加數(shù)據(jù)

在原始的正在監(jiān)聽的終端中,會(huì)看到如下信息:

[root@localhost ~]# tail -f anaconda-ks.cfg @server-platforin
@server-policy
pax
oddjob
sgpio
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite
%end2222222222
33333333333
#在文件的結(jié)尾處監(jiān)聽到了新増數(shù)據(jù)

3. ln命令:在文件之間建立鏈接(硬鏈接和軟鏈接)

如果要想說清楚 ln 命令,則必須先解釋下 ext 文件系統(tǒng)是如何工作的。我們在前面講解了分區(qū)的格式化就是寫入文件系統(tǒng),而我們的 Linux 目前使用的是 ext4 文件系統(tǒng)。如果用一張示意圖來描述 ext4 文件系統(tǒng)。


image.png

ext4 文件系統(tǒng)會(huì)把分區(qū)主要分為兩大部分(暫時(shí)不提超級(jí)塊):小部分用于保存文件的 inode (i 節(jié)點(diǎn))信息;剩余的大部分用于保存 block 信息。

inode 的默認(rèn)大小為 128 Byte,用來記錄文件的權(quán)限(r、w、x)、文件的所有者和屬組、文件的大小、文件的狀態(tài)改變時(shí)間(ctime)、文件的最近一次讀取時(shí)間(atime)、文件的最近一次修改時(shí)間(mtime)、文件的數(shù)據(jù)真正保存的 block 編號(hào)。每個(gè)文件需要占用一個(gè) inode。大家如果仔細(xì)查看,就會(huì)發(fā)現(xiàn) inode 中是不記錄文件名的,那是因?yàn)槲募涗浽谖募谀夸浀?block 中。

block 的大小可以是 1KB、2KB、4KB,默認(rèn)為 4KB。block 用于實(shí)際的數(shù)據(jù)存儲(chǔ),如果一個(gè) block 放不下數(shù)據(jù),則可以占用多個(gè) block。例如,有一個(gè) 10KB 的文件需要存儲(chǔ),則會(huì)占用 3 個(gè) block,雖然最后一個(gè) block 不能占滿,但也不能再放入其他文件的數(shù)據(jù)。這 3 個(gè) block 有可能是連續(xù)的,也有可能是分散的。
ln命令格式
了解了 ext 文件系統(tǒng)的概念,我們來看看 ln 命令的基本信息。
命令名稱:ln。
英文原意:make links between file0
所在路徑:/bin/ln。
執(zhí)行權(quán)限:所有用戶。
功能描述:在文件之間建立鏈接。

ln 命令的基本格式如下:

[root@localhost ~]# ln [選項(xiàng)] 源文件 目標(biāo)文件

選項(xiàng):
-s:建立軟鏈接文件。如果不加"-s"選項(xiàng),則建立硬鏈接文件;
-f:強(qiáng)制。如果目標(biāo)文件已經(jīng)存在,則刪除目標(biāo)文件后再建立鏈接文件;

如果創(chuàng)建硬鏈接:

[root@localhost ~]# touch cangls
[root@localhost ~]# ln /root/cangls /tmp/
#建立硬鏈接文件,目標(biāo)文件沒有寫文件名,會(huì)和原名一致
#也就是 /root/cangls 和 /tmp/cangls 是硬鏈接文件

如果創(chuàng)建軟鏈接:

[root@localhost ~]# touch bols
[root@localhost ~]# In /root/bols /tmp/
#建立軟鏈接文件

\color{red}{這里需要注意,軟鏈接文件的源文件必須寫成絕對路徑,而不能寫成相對路徑(硬鏈接沒有這樣的要求);否則軟鏈接文件會(huì)報(bào)錯(cuò)。這是初學(xué)者非常容易犯的錯(cuò)誤。}

建立硬鏈接和軟鏈接非常簡單,那這兩種鏈接有什么區(qū)別?
它們都有什么作用?這才是鏈接文件最不容易理解的地方,我們分別來講講。
硬鏈接
我們再來建立一個(gè)硬鏈接文件,然后看看這兩個(gè)文件的特點(diǎn)。

[root@localhost ~]# touch test
#建立源文件
[root@localhost ~]# ln /root/test /tmp/test-hard
#給源文件建立硬鏈接文件 /tmp/test-hard
[root@localhost ~]# ll -i /root/test /tmp/test-hard
262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /root/test
hard
262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /tmp/test-hard
#查看兩個(gè)文件的詳細(xì)信息,可以發(fā)現(xiàn)這兩個(gè)文件的 inode 號(hào)是一樣的,"ll"等同于"ls -l"。

這里有一件很奇怪的事情,我們之前在講 inode 號(hào)的時(shí)候說過,每個(gè)文件的 inode 號(hào)都應(yīng)該是不一樣的。inode 號(hào)就相當(dāng)于文件 ID,我們在查找文件的時(shí)候,要先查找 inode 號(hào),才能讀取到文件的內(nèi)容。
但是這里源文件和硬鏈接文件的 inode 號(hào)居然是一樣的,那我們在查找文件的時(shí)候,到底找到的是哪一個(gè)文件呢?


image.png

在 inode 信息中,是不會(huì)記錄文件名稱的,而是把文件名記錄在上級(jí)目錄的 block 中。也就是說,目錄的 block 中記錄的是這個(gè)目錄下所有一級(jí)子文件和子目錄的文件名及 inode 的對應(yīng);而文件的 block 中記錄的才是文件實(shí)際的數(shù)據(jù)。

當(dāng)我們查找一個(gè)文件,比如 /root/test 時(shí),要經(jīng)過以下步驟:
首先找到根目錄的 inode(根目錄的 inode 是系統(tǒng)已知的,inode 號(hào)是 2),然后判斷用戶是否有權(quán)限訪問根目錄的 block。
如果有權(quán)限,則可以在根目錄的 block 中訪問到 /root 的文件名及對應(yīng)的 inode 號(hào)。
通過 /root/ 目錄的 inode 號(hào),可以查找到 /root/ 目錄的 inode 信息,接著判斷用戶是否有權(quán)限訪問 /root/ 目錄的 block。
如果有權(quán)限,則可以從 /root/ 目錄的 block 中讀取到 test 文件的文件名及對應(yīng)的 inode 號(hào)。
通過 test 文件的 inode 號(hào),就可以找到 test 文件的 inode 信息,接著判斷用戶是否有權(quán)限訪問 test 文件的 block。
如果有權(quán)限,則可以讀取 block 中的數(shù)據(jù),這樣就完成了 /root/test 文件的讀取與訪問。

按照這個(gè)步驟,在給源文件 /root/test 建立了硬鏈接文件 /tmp/test-hard 之后,在 /root/ 目錄和 /tmp/ 目錄的 block 中就會(huì)建立 test 和 test-hard 的信息,這個(gè)信息主要就是文件名和對應(yīng)的 inode 號(hào)。但是我們會(huì)發(fā)現(xiàn) test 和 test-hard 的 inode 信息居然是一樣的,那么,我們無論訪問哪個(gè)文件,最終都會(huì)訪問 inode 號(hào)是 262147 的文件信息。

這就是硬鏈接的原理。硬鏈接的特點(diǎn)如下:
不論是修改源文件(test 文件),還是修改硬鏈接文件(test-hard 文件),另一個(gè)文件中的數(shù)據(jù)都會(huì)發(fā)生改變。
不論是刪除源文件,還是刪除硬鏈接文件,只要還有一個(gè)文件存在,這個(gè)文件(inode 號(hào)是 262147 的文件)都可以被訪問。
硬鏈接不會(huì)建立新的 inode 信息,也不會(huì)更改 inode 的總數(shù)。
硬鏈接不能跨文件系統(tǒng)(分區(qū))建立,因?yàn)樵诓煌奈募到y(tǒng)中,inode 號(hào)是重新計(jì)算的。
硬鏈接不能鏈接目錄,因?yàn)槿绻o目錄建立硬鏈接,那么不僅目錄本身需要重新建立,目錄下所有的子文件,包括子目錄中的所有子文件都需要建立硬鏈接,這對當(dāng)前的 Linux 來講過于復(fù)雜。
硬鏈接的限制比較多,既不能跨文件系統(tǒng),也不能鏈接目錄,而且源文件和硬鏈接文件之間除 inode 號(hào)是一樣的之外,沒有其他明顯的特征。這些特征都使得硬鏈接并不常用,有所了解就好。

[root@localhost ~]# echo 1111 >>/root/test
#向源文件中寫入數(shù)據(jù)
[root@localhost ~]# cat /root/test
1111
[root@localhost ~]# cat /tmp/test-hard
1111
#源文件和硬鏈接文件都會(huì)發(fā)生改變
[root@localhost ~]# echo 2222 >> /tmp/test-hard
#向硬鏈接文件中寫入數(shù)據(jù)
[root@localhost ~]# cat /root/test
1111
2222
[root@localhost ~】# cat /tmp/test-hard
1111
2222
#源文件和硬鏈接文件也都會(huì)發(fā)生改變
[root@localhost ~]# rm -rf/root/test
#刪除源文件
[root@localhost ~]# cat /tmp/test-hard
1111 2222
#硬鏈接文件依然可常讀取

軟鏈接
軟鏈接也稱作符號(hào)鏈接,相比硬鏈接來講,軟鏈接就要常用多了。我們先建立一個(gè)軟鏈接,再來看看軟鏈接的特點(diǎn)。

[root@localhost ~]# touch check
#建立源文件
[root@localhost ~]# ln -s /root/check /tmp/check-soft
#建立軟鏈接文件
[root@localhost ~]# ll -id /root/check /tmp/check-soft
262154 -rw-r--r-- 1 root root 0 6月 19 11:30 /root/check
917507 lrwxrwxrwx 1 root root 11 6月 19 11:31 /tmp/ check-soft -> /root/check
#軟鏈接和源文件的 inode 號(hào)不一致,軟鏈接通過 -> 明顯地標(biāo)識(shí)出源文件的位置
#在軟鏈接的權(quán)限位 lrwxrwxrwx 中,l 就代表軟鏈接文件

再強(qiáng)調(diào)一下,軟鏈接的源文件必須寫絕對路徑,否則建立的軟鏈接文件就會(huì)報(bào)錯(cuò),無法正常使用。
軟鏈接的標(biāo)志非常明顯,首先,權(quán)限位中"l"表示這是一個(gè)軟鏈接文件;其次,在文件的后面通過 "->" 顯示出源文件的完整名字。所以軟鏈接比硬鏈接的標(biāo)志要明顯得多,而且軟鏈接也不像硬鏈接的限制那樣多,比如軟鏈接可以鏈接目錄,也可以跨分區(qū)來建立軟鏈接。
軟鏈接完全可以當(dāng)作 Windows 的快捷方式來對待,它的特點(diǎn)和快捷方式一樣,我們更推薦大家使用軟鏈接,而不是硬鏈接。
大家在學(xué)習(xí)軟鏈接的時(shí)候會(huì)有一些疑問:Windows 的快捷方式是由于源文件放置的位置過深,不容易找到,建立一個(gè)快捷方式放在桌面,方便查找,那 Linux 的軟鏈接的作用是什么呢?
軟鏈接主要是為了照顧管理員的使用習(xí)慣。比如,有些系統(tǒng)的自啟動(dòng)文件 /etc/rc.local 放置在 /etc/ 目錄中,而有些系統(tǒng)卻將其放置在 /etc/rc.d/rc.local 中,那么干脆對這兩個(gè)文件建立軟鏈接,不論你習(xí)慣操作哪一個(gè)文件,結(jié)果都是一樣的。
如果你比較細(xì)心,則應(yīng)該已經(jīng)發(fā)現(xiàn)軟鏈接和源文件的 inode 號(hào)是不一致的,我們也畫一張示意圖來看看軟鏈接的原理:


image.png

軟鏈接和硬鏈接在原理上最主要的不同在于:硬鏈接不會(huì)建立自己的 inode 索引和 block(數(shù)據(jù)塊),而是直接指向源文件的 inode 信息和 block,所以硬鏈接和源文件的 inode 號(hào)是一致的;而軟鏈接會(huì)真正建立自己的 inode 索引和 block,所以軟鏈接和源文件的 inode 號(hào)是不一致的,而且在軟鏈接的 block 中,寫的不是真正的數(shù)據(jù),而僅僅是源文件的文件名及 inode 號(hào)。

我們來看看訪問軟鏈接的步驟和訪問硬鏈接的步驟有什么不同。
首先找到根目錄的 inode 索引信息,然后判斷用戶是否有權(quán)限訪問根目錄的 block。
如果有權(quán)限訪問根目錄的 block,就會(huì)在 block 中查找到 /tmp/ 目錄的 inode 號(hào)。
接著訪問 /tmp/ 目錄的 inode 信息,判斷用戶是否有權(quán)限訪問 /tmp/ 目錄的 block。
如果有權(quán)限,就會(huì)在 block 中讀取到軟鏈接文件 check-soft 的 inode 號(hào)。因?yàn)檐涙溄游募?huì)真正建立自己的 inode 索引和 block,所以軟鏈接文件和源文件的 inode 號(hào)是不一樣的。
通過軟鏈接文件的 inode 號(hào),找到了 check-soft 文件 inode 信息,判斷用戶是否有權(quán)限訪問 block。
如果有權(quán)限,就會(huì)發(fā)現(xiàn) check-soft 文件的 block 中沒有實(shí)際數(shù)據(jù),僅有源文件 check 的 inode 號(hào)。
接著通過源文件的 inode 號(hào),訪問到源文件 check 的 inode 信息,判斷用戶是否有權(quán)限訪問 block。
如果有權(quán)限,就會(huì)在 check 文件的 block 中讀取到真正的數(shù)據(jù),從而完成數(shù)據(jù)訪問。

通過這個(gè)過程,我們就可以總結(jié)出軟鏈接的特點(diǎn)(軟鏈接的特點(diǎn)和 Windows 中的快捷方式完全一致)。
不論是修改源文件(check),還是修改硬鏈接文件(check-soft),另一個(gè)文件中的數(shù)據(jù)都會(huì)發(fā)生改變。
刪除軟鏈接文件,源文件不受影響。而刪除原文件,軟鏈接文件將找不到實(shí)際的數(shù)據(jù),從而顯示文件不存在。
軟鏈接會(huì)新建自己的 inode 信息和 block,只是在 block 中不存儲(chǔ)實(shí)際文件數(shù)據(jù),而存儲(chǔ)的是源文件的文件名及 inode 號(hào)。
軟鏈接可以鏈接目錄。
軟鏈接可以跨分區(qū)。

[root@localhost ~]# echo 111>>/root/check
#修改源文件
[root@localhost ~]# cat /root/check
111
[root@localhost ~]# cat /tmp/check-soft
111
#不論是源文件還是軟鏈接文件,數(shù)據(jù)都發(fā)生改變
[root@localhost ~]# echo 2222 >>/tmp/check-soft
#修改軟鏈接文件
[root@localhost ~]# cat /tmp/check-soft
111
2222
[root@localhost ~]# cat /root/check
111
2222
#不論是源文件還是軟鏈接文件,數(shù)據(jù)也都會(huì)發(fā)生改變
[root@localhost ~]# rm -rf/root/check
#刪除源文件
[root@localhost ~]# cat /tmp/check-soft
cat: /tmp/check-soft:沒有那個(gè)文件或目錄
#軟鏈接無法正常使用

軟鏈接是可以鏈接目錄的,例如:

[root@localhost ~]# mkdir test
#建立源目錄
[root@localhost ~]# ln -s /root/test/ /tmp/
[root@localhost ~]# ll -d /tmp/test
lrwxrwxrwx 1 root root 11 6月 19 12:43 /tmp/test->/root/test/
#軟鏈接可以鏈接目錄
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容