Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

程式設計師聯盟發表於2017-04-03

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

-- 作者 謝恩銘 轉載請註明出處

內容簡介


  1. 第二部分第四課:檔案操縱,股掌之中
  2. 第二部分第五課預告:使用者和許可權,有權就任性

檔案操縱,股掌之中


既然上一課 Linux探索之旅 | 第二部分第三課:檔案和目錄,組織不會虧待你 中,我們學習了Linux中的檔案組織方式,那麼現在就該是玩弄,啊不,是操縱它們的時候了。

檔案操作有哪些呢?一般就是顯示檔案內容啦,還有拷貝檔案,移動檔案,刪除檔案,等等。

這一課我們還會學習連結的知識,認識硬連結和軟連結的區別和原理。

當然了,雖說是檔案操作,但是目錄操作我們也會說。因為在Linux中,一切皆檔案,目錄也是檔案。

這一課有很重要的基礎概念,而且要學不少命令,都是很常用的。

希望大家認真學習。但也不要怕,我們的課程會秉持淺顯易懂的原則,帶大家領略Linux的無窮魅力。

“酒經三巡難話休,菜過五味不絮煩”,小編你要做到“話休絮煩”,不難吧?

cat命令和less命令:顯示檔案內容


首先,我們來學習一下如何顯示檔案的內容。在Linux中,有好幾個命令都可以顯示檔案內容,不過最常用的還是:

  • cat

  • less

這兩個命令只能顯示檔案內容,並不能對檔案內容進行修改。之後我們會學習如何編輯檔案的,不過那需要一整課的內容才行。

也許你會問:“為什麼要學習兩個命令呢?既然這兩個命令都能顯示檔案內容,我學一個不就好了?”

事實上,這兩個命令各有特色。我們分別來學習。

在開始學習今天的這些命令之前,我們來介紹一個我們將要操作的檔案:syslog。

syslog這個檔案位於/var/log這個目錄中。還記得上一課講的麼,/var這個目錄通常包含程式的資料,比如一些log(日誌)檔案,記錄電腦中發生了什麼事。

我們用cd命令來進入/var/log,再用ls命令看看裡面有什麼:

cd /var/log
ls複製程式碼

如下圖所示:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

可以看到好多種不同顏色的檔案,記得我們上一課說的嗎?

  • 藍色-->目錄

  • 綠色-->可執行檔案

  • 紅色-->壓縮檔案

  • 淺藍色-->連結檔案

  • 灰色-->其他檔案

我們看到syslog這個檔案了,它是一個普通檔案。不過這個檔案很有用,因為它是當下你電腦裡發生的幾乎所有事情的日誌。其實從名字我們也可以窺見一二,syslog由sys和log組成,sys是system的縮寫,是英語“系統”的意思;log就是log,是英語“日誌”的意思。

你可能注意到了,我們在Linux中看到的檔案,很多都是沒有字尾名的,如果習慣Windows的使用者可能不太適應,因為Windows中一般這類檔案會像這樣命名:syslog.txt,syslog.log,等等。

即使Linux下很多檔案沒有字尾名,也不影響它們的顯示和編輯,和其他檔案是一樣的。

cat命令:一次性顯示檔案的所有內容


cat命令可以一次性在終端中顯示檔案的所有內容。

cat命令的用法也很簡單,只需要在命令後加上想要顯示的檔案路徑即可。例如:

cd /var/log
cat syslog複製程式碼

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

syslog檔案的內容很多,一頁根本顯示不下,所以我們的截圖只能看到一頁內容,其實下面還有很多。

不過,cat命令的初衷就是如此:顯示檔案的所有內容。不過我們也意識到了,cat命令更適合處理小檔案。

cat命令沒有什麼引數比較值得學習。因為這個命令比較簡單,如果你想要在顯示的檔案內容上加上行號,那麼你可以加上 -n 這個引數:

cat -n syslog複製程式碼

less命令:分頁顯示檔案內容


cat命令會把檔案所有內容一下子顯示出來,如果檔案比較大,是會令人“猝不及防”的。

這種時候,另外的一個命令less就顯得必不可少了。less命令和cat命令之間最大的區別就是:less命令會分一頁一頁地顯示檔案內容,使我們可以方便地在終端裡閱讀。

當然了,其實還有個命令是more。不過這個more命令和less命令的功能是類似的,而且more的缺陷就是它沒有less那麼強大,比如more命令雖然也是一頁一頁地顯示檔案,但是我們不能往後翻頁,只能往前,“一路向北”。

而且less命令還有更多其他功能是more沒有的,究其原因呢就是more是比較老的命令了。這年頭畢竟是吃“青春飯”的,more命令只能說:“臣妾做不到啊”...

less命令的用法與cat命令是一樣的,也是在命令之後直接加檔案的路徑:

less syslog複製程式碼

顯示如下:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

less命令的好處是它會先讀入檔案開始的若干行,然後就停在那裡,而這若干行的行數取決於終端螢幕的大小。這樣的好處是我們可以有時間去漸進地讀檔案的內容。

所以,暫時說來,我們只讀取了檔案的頭幾行。

那怎麼讀取檔案後面的內容呢?

讓我們來學習一些有用的鍵盤快捷鍵吧。

首先來看less命令中最基本最常用的快捷鍵:

  • 空格鍵:檔案內容讀取下一個終端螢幕的行數,相當於前進一個螢幕(頁)。很常用的快捷鍵。與鍵盤上的PageDown(下一頁)效果一樣。

  • Enter鍵:檔案內容讀取下一行,也就是前進一行。與鍵盤上的向下鍵效果是一樣的。

  • d鍵:前進半頁(半個螢幕)。

  • b鍵:後退一頁。與鍵盤上的PageUp(上一頁)效果一樣。

  • y鍵:後退一行。與鍵盤上的向上鍵效果是一樣的。

  • u鍵:後退半頁(半個螢幕)。

  • q鍵:停止讀取檔案,中止less命令。

這裡所說的快捷鍵當中提到字母時,大小寫是需要區分的。
比如我們說到d鍵,那麼就是小寫字母d,而不是大寫字母D(shift + d)。
在Linux中,通常來說都區分大小寫。

再來看看一些略顯高階的快捷鍵,雖然不像上面的幾個那麼常用,但學習一下也真是極好的:

  • =號:顯示你在檔案中的什麼位置(會顯示當前頁面的內容是檔案中第幾行到第幾行,整個檔案所含行數,所含字元數,整個檔案所含字元)。

  • h鍵:顯示幫助文件。按q鍵退出幫助文件。

  • /(斜槓):進入搜尋模式,只要在斜槓後面輸入你要搜尋的文字,按下Enter鍵,就會把所有符合的結果都標識出來。要在搜尋所得結果中跳轉,可以按n鍵(跳到下一個符合專案),N鍵(shift鍵+n。跳到上一個符合專案)。當然了,正規表示式(Regular Expression)也是可以用在搜尋內容中的。這裡我們就不細說什麼是正規表示式了,有興趣可以百度看看。

  • n鍵:跳到下一個符合的搜尋結果。

  • N鍵:跳到上一個符合的搜尋結果。

如你所見,less命令很強大,可以幫助我們更好地瀏覽檔案內容。

雖然說一開始要記著這些快捷鍵有點累人,但是熟練之後絕對讓你事半功倍。

head命令和tail命令:顯示檔案的開頭和結尾


額,除了cat和less,讀取檔案內容還有其他命令要學啊... “臣妾做不到啊...”

但是這兩個新命令可是很有用的,特別是tail。所以放下“皇后”的架子,來學一下吧。

這兩個命令有點對立的關係,因為head命令用於顯示檔案的開頭幾行,tail命令用於顯示檔案結尾的幾行。

head命令:顯示檔案開頭


head在英語中是“頭部”的意思,所以顧名思義,這個命令用於顯示檔案的開頭。

預設情況下,head會顯示檔案的頭10行:

head syslog複製程式碼

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

我們也可以指定顯示的行數,用 -n 這個引數:

head -n 5 syslog複製程式碼

就會顯示檔案的頭5行。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

tail命令:顯示檔案結尾


tail在英語中是“尾部”的意思,所以顧名思義,這個命令用於顯示檔案的結尾。

預設情況下,tail會顯示檔案的尾10行。

我們也可以指定顯示的行數,用 -n 這個引數:

tail -n 5 syslog複製程式碼

就會顯示檔案的尾5行。

如果你認為tail命令就這點本事,那您就大錯特錯啦... “大錯特錯不要來侮辱我的美,我不是你的style,為何偏偏纏著我”... 小編你藥不能停啊~

tail命令還可以配合 -f 引數來實時追蹤檔案的更新:

tail -f syslog複製程式碼

這樣,就會檢查檔案是否有追加內容,如果有,就顯示新增內容。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

可以用快捷鍵 Ctrl + c 來終止tail -f 命令。

事實上,Ctrl + c這個組合快捷鍵(同時按下)可以終止大部分終端的命令和正在執行的程式,有點類似Windows中的Alt + F4。

預設地,tail -f會每過1秒檢查一下檔案是否有新內容。你也可以指定間隔檢查的秒數,用 -s 引數:

tail -f -s 4 syslog      #每隔4秒檢查一次檔案是否有更新複製程式碼
tail -f -s 2.5 syslog    #每隔2.5秒檢查一次檔案是否有更新複製程式碼

touch命令和mkdir命令:建立檔案和目錄


長舒一口氣嗎?終於結束瞭如何顯示檔案的學習。

我們再來看看其他檔案操作。

touch命令:建立一個空白檔案


事實上,Linux沒有一個命令是專門用來建立一個空白檔案的。

平時我們習慣用文字編輯器(Emacs,Vim,gedit,Sublime Text,nano等)來建立空白檔案,並且編輯檔案。

touch命令其實一開始的設計初衷是修改檔案的時間戳,就是可以修改檔案的建立時間或修改時間,讓電腦以為檔案是在那個時候被修改或建立的。

touch在英語中是“觸控,觸碰”的意思,就是說我碰一下那個檔案,讓電腦以為我剛修改過。

但是,為什麼把touch命令放在這裡來學習呢?因為touch命令如果後面跟著的檔名是不存在的,那麼它就會新建一個。

touch的用法也比較簡單,就是touch命令後面直接跟檔案路徑。

我們在演示touch命令的用法前,得先挪個地方,因為我們不希望在 /var/log 這個系統目錄裡“搞七捻三”。

如果你認真學習了前幾課,那麼你應該知道如何快速的回到我們的使用者家目錄,是的,就是單獨一個 cd 命令,什麼引數也不加。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

使用touch命令建立新的空白檔案之前,我們還得挪個地方,因為小編的家目錄裡面檔案太多,不容易看到一會touch新生成的檔案。

所以我們cd到一個已存在的目錄,比如我可以進入 linux_c 這個目錄 (當然,作為讀者的你完全可以用你自己的家目錄,如果裡面檔案不多的話):

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

我們用ls -F 看到了目前存在於我們的 ~/linux_c 資料夾中的檔案。

那麼我們用touch命令來建立新檔案:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

看到了嗎,我們用 touch new_file 建立了一個名叫 new_file 的新空白檔案。

我們可以再來建立一個:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

事實上,我們可以用touch命令同時建立多個檔案:

touch new_file new_file_2複製程式碼

如果我所要建立的檔案的名字裡有空格怎麼辦呢?

很簡單,加上雙引號:

touch "new file"複製程式碼

不過,在Linux中,還是儘量不要讓檔案或目錄名字中有空格,有時會給程式設計造成麻煩。

mkdir:建立一個目錄


如果說touch命令可以用來建立一個檔案,那麼mkdir命令就是用於建立一個目錄的。

mkdir其實是mk和dir的縮合,mk是make的縮寫,表示“建立”;dir是directory的縮寫,表示“目錄”。

所以,學程式設計過程中我們也可以邊提高英語,不是嗎?

mkdir的用法也和touch一樣,就是後面接需要建立的目錄路徑。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

可以看到,我們用 mkdir new_folder 建立了一個名叫 new_folder 的新目錄,這個目錄裡當然還沒有什麼東西。

可以看到用 ls -F 命令後,顯示的new_folder是深藍色的,表示它是一個目錄。

mkdir也可以同時建立好幾個目錄:

mkdir new_folder new_folder_2複製程式碼

如果我所要建立的目錄的名字裡有空格怎麼辦呢?

很簡單,加上雙引號:

mkdir "new folder"複製程式碼

我們還可以用 -p 引數來遞迴建立目錄結構。

比如:

mkdir -p one/two/three複製程式碼

就會先建立one這個目錄,在one目錄裡面建立two這個目錄,在two裡面再建立three這個目錄:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

cp命令和mv命令:拷貝檔案和移動檔案


接著來學習很重要的檔案拷貝和移動的操作,還有檔案的重新命名。

cp命令:拷貝檔案或目錄


cp是英語copy的縮寫,表示“拷貝”。所以,顧名思義,此命令用於拷貝。cp命令不僅可以拷貝單個檔案,還可以拷貝多個檔案,也可以拷貝目錄。

如果我們要拷貝剛才建立的new_file檔案怎麼做呢?很簡單:

cp new_file new_file_copy複製程式碼

第一個檔案new_file是已經存在的檔案,也就是被拷貝的檔案;第二個檔案new_file_copy是需要建立的檔案,是new_file的副本,內容一模一樣。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

我們可以看到,我們用cp命令在當前目錄下建立了new_file的副本new_file_copy。

複製檔案到另一個目錄


上面的例子中,我們是在當前目錄下拷貝了檔案new_file,並生成了它的副本new_file_copy。

當然,我們並不一定要在同一個目錄下拷貝。我們也可以把檔案拷貝到其他目錄。

只需要把cp命令的第二個引數換成目錄名。

cp new_file one/複製程式碼

上面的命令就把new_file這個檔案拷貝到了one這個目錄中。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

原先我們的one目錄下只有two這個子目錄,現在多了一個檔案new_file,它的內容和one目錄的上層目錄linux_c中的new_file是一樣的。

如果你想拷貝檔案到其他目錄的同時,不要具有相同名字,那麼可以這樣做:

cp new_file one/new_file_copy複製程式碼

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

看到了嗎,one這個目錄裡多了一個new_file_copy的檔案,它的內容和one目錄的上層目錄linux_c中的new_file是一樣的。

拷貝目錄


要拷貝目錄,只要在cp命令之後加上-R引數(注意是大寫的R)。拷貝的時候,目錄中的所有內容(子目錄和檔案)都會被拷貝。

之前,我們建立了一個目錄one,現在我們將其拷貝為one_copy看看:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

看到了嗎?one_copy目錄中的內容和one裡面一模一樣。

使用萬用字元\*


*號(星號)是很常用的正規表示式的符號,被稱為“萬用字元”,顧名思義就是百搭,可以替代任意字串。

所以如果我們用如下命令:

cp *.txt folder複製程式碼

那麼就會把當前目錄下所有txt檔案拷貝到folder這個子目錄當中。

又如:

cp ha* folder複製程式碼

那麼就會把當前目錄下凡是以ha開頭的檔案都拷貝到folder目錄中。

萬用字元是極為強大的,如果用得好,可以大大提高效率。是不是覺得比在Windows下用滑鼠拷貝檔案快捷很多呢?

mv命令:移動檔案


mv是英語move的縮寫,表示“移動”。mv命令有兩個功能:

  • 移動檔案(或目錄)

  • 重新命名檔案(或目錄)

移動檔案

與cp命令用法類似,不同的是cp命令會複製當前檔案,而mv命令則是單純的移動,並不會製作副本。

所以,cp命令就好比Windows中的複製+黏貼,而mv命令就好比Windows中的剪下+黏貼。

mv new_file_2 one複製程式碼

以上命令將new_filw_2這個檔案移動到one這個目錄,使得原先存在於linux_c這個目錄的new_file_2檔案不存在了。

看到與cp的不同了嗎,之前我們用cp命令的時候,原檔案還是在的,只是把副本移動到了其他目錄。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

用mv命令來移動目錄很簡單,不需要額外的引數,就跟移動檔案一樣:

mv new_folder one複製程式碼

以上命令將new_folder這個目錄(包括其下的子目錄和檔案)移動到one這個目錄中。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

當然,我們也可以使用萬用字元:

mv *.txt one複製程式碼

以上命令是將當前目錄下所有txt檔案移動到one這個目錄中。

除了移動檔案,mv命令還可以用於重新命名檔案。

事實上,Linux中沒有一個專門的命令用於重新命名檔案。之所以mv命令可以重新命名檔案,其實還是歸因於它的機制:移動檔案。經過mv移動之後,原始檔案變成了新的名字的檔案,檔案內容是不變的,這不就相當於重新命名了嗎?

mv new_file renamed_file複製程式碼

以上命令會將new_file重新命名為renamed_file

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

希望大家好好練習cp和mv這兩個命令,因為這兩個命令真的很常用。

好了,經過了這一系列cp和mv的操作,現在我們的目錄linux_c已經有點凌亂了。是時候做一些清理工作了,有請我們的rm命令。

rm命令:刪除檔案和目錄


rm是英語remove的縮寫,表示“移除”。這個命令就是用來刪除東西的。

rm命令可不好惹。

為什麼說它不好惹呢?因為在終端中沒有回收站或垃圾箱,如果用rm命令刪除了檔案,那可沒後悔藥吃,一般比較難恢復(還是有辦法可以恢復的,只是挺麻煩)。

所以rm命令用起來雖然很酸爽,但是還需謹慎啊。

rm命令可以刪除一個檔案,多個檔案,目錄,甚至你的整個Linux系統(如果你願意的話)。

rm new_file_copy複製程式碼

以上命令刪除當前目錄下的new_file_copy這個檔案。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

我們也可以同時刪除多個檔案,只要用空格隔開每個檔案即可。例如:

rm file1 file2 file3複製程式碼

-i 引數:向使用者確認是否刪除


保險起見,用rm命令刪除檔案時,可以加上 -i 引數,這樣對於每一個要刪除的檔案,終端都會詢問我們是否確定刪除。i是英語inform的縮寫,表示“告知,通知”。

有兩種回答:

  • y:是英語yes的縮寫,表示“是”。那麼回車確認後,檔案就刪除了。

  • n:是英語no的縮寫,表示“否”。那麼回車確認後,檔案不會刪除。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

上圖中,我輸入了n,再回車,那麼rm命令就不生效,檔案沒有被刪除。如果我輸入的是y,那麼檔案就會被刪除。

-f引數:慎用,不會詢問是否刪除,強制刪除


如果在rm命令後加上-f引數,那麼終端不會詢問使用者是否確定刪除檔案,不論如何,檔案會立刻被強制刪除。

f是英語force的縮寫,表示“強迫,強制”。

rm -f file複製程式碼

以上命令會強制刪除file檔案。

-r引數:遞迴地刪除


r是英語recursive的縮寫,表示“遞迴的”。所以使用-r引數,可以使rm命令刪除目錄,並且遞迴刪除其包含的子目錄和檔案。

這個命令也挺危險的,用得不好可能你的子目錄和檔案都沒了。

rm -r one複製程式碼

以上命令會刪除one這個目錄,包括其子目錄和檔案。

其實,也存在一個命令rmdir,看著和rm -r挺像的。但是這個命令有個侷限性:只能刪除空的目錄。

rm命令加-r和-f引數:極為危險!


前方高能預警!

為什麼說rm -rf命令極為危險呢?因為不湊巧的話,你可能毀了整個作業系統。

接下來,我們要給大家演示一個很可怕的命令,一個令人聞風哭泣的命令,一個“未成年人免入”的命令,一個“草木為之含悲,風雲因而變色”的命令。小編你夠了...

是的,那就是:

千萬不要這樣做! => rm -rf /* 或者 rm -rf /

請讀者千萬不要抱著試試看的心態,複製這條命令,然後用管理員身份執行這條命令。因為這條命令會刪除你的整個Linux系統,如果你的Windows系統也掛載在Linux下,那麼也會把你的Windows系統刪了。所以,千萬不要玩火!

這條命令可謂是Linux中頭號一等危險的命令。歷史上有一些公司就因為這個命令造成過慘重的損失。

我們把這條命令分解開來分析:

  • rm:rm命令,這個沒問題吧,刪除命令麼。

  • -r:遞迴刪除。

  • -f:不詢問,強制刪除。

  • /:系統的根目錄。後面可以不加萬用字元*,也可以加。

所以整個命令的意思很明確:強制遞迴刪除根目錄下所有檔案!

但你要問了:“既然有這麼危險的命令,那麼為什麼Linux的開發者允許這樣的命令存在呢?”

這是因為,不一定是誰都可以執行這條命令的,比如我暫時是以oscar這個使用者登入的,oscar是普通使用者,是不具備執行這條命令的許可權的,但如果是系統的超級使用者,大管家root的話,執行這條命令是完全沒問題的。

所以,這也是為什麼我們說初學者儘量不要登入為root。

下一課我們會講使用者和許可權,到時候會有更深理解。

最後提醒一次:不管何種情況,千萬不要執行這條命令: rm -rf /

ln命令:建立連結


雖然說ln這個命令不是特別常用,比之前的cp,mv,rm等使用頻率要低,但是這個命令很有用。

ln是link的縮寫,在英語中表示“連結”。所以ln命令用於在檔案之間建立連結。說起連結可能你比較陌生,那麼為了簡單起見,我們用一個你比較熟悉的詞好了:快捷方式。

雖然Linux的連結比起Windows的快捷方式要更復雜一些。但是性質是類似的。

事實上,Linux下有兩種連結型別:

  • Physical link:物理連結或硬連結。

  • Symbolic link:符號連結或軟連線。

為了區分這兩種連結型別的不同,我們首先來談一談如Linux這樣的作業系統中檔案在硬碟上的存放。

好啦,不要做苦瓜臉啦,只不過講一下作業系統的一些原理,對於我們更好地理解是很有幫助的。

檔案的儲存


在硬碟上儲存時,大致來說(請注意我用了“大致來說”),每個檔案有兩部分:

  • 檔名

  • 檔案內容

檔名的列表是儲存在硬碟的其他地方的,和檔案內容分開存放,這樣方便Linux管理。

注意:為什麼我上面要用“大致說來”呢?因為此處我們簡化了描述,其實每個檔案有三部分:

  • 檔名

  • 許可權

  • 檔案內容

我們這裡簡化地將檔案分為兩部分:檔名和檔案內容。因為我們不想把事情複雜化,我們想要理解兩種連結型別的區別,暫時只要知道這些就夠了。

每個檔案的檔案內容被分配到一個標示號碼,就是inode。因此每個檔名都繫結到它的檔案內容(用inode標識),原理如下圖:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

理解了這點就可以學習下面的了,暫時我們並不需要鑽研太深。當然有興趣的話,也可以百度一下inode,看一些資料,加深理解。

下面我們學習如何建立硬連結和軟連線。

建立硬連結


比之軟連結,硬連結的使用機率小很多。但是我們還是要學習一下,畢竟可能會用到。

硬連結的原理:使連結的兩個檔案共享同樣的檔案內容,也就是同樣的inode。

所以一旦檔案1和檔案2之間有了硬連結,那麼你修改檔案1或檔案2,其實修改的是相同的一塊內容。只不過我們可以用兩個檔名來取到檔案內容。

硬連結有一個缺陷:只能建立指向檔案的硬連結,不能建立指向目錄的硬連結。但是軟連結可以指向檔案或目錄。當然了,事實上,通過一些引數的修改,也可以建立指向目錄的硬連結,但是比較複雜,這裡不再詳述。所以對於目錄的連結,我們一般都是用軟連結。

為了演示硬連結和軟連結的操作,我們在家目錄下新建一個目錄吧。

cd
mkdir test
cd test複製程式碼

並且用touch命令建立一個新的空白檔案:

touch file1複製程式碼

我們接著來建立一個檔案file2,使之成為file1的硬連結。

要建立硬連結,直接用ln命令,不加任何引數:

ln file1 file2複製程式碼

以上命令建立了file1的一個硬連結file2。

硬連結原理圖:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

上圖中,我們看到,file2是新生成的硬連結,它指向file1的檔案內容,也就是說它們共享相同的檔案內容,也就是擁有同一個inode。

我們用ls -l命令看一下,彷彿看不出什麼端倪。因為目前看來,並沒什麼因素使我們相信這兩個檔案指向同一塊檔案內容(同一個inode)。不過從淺藍色可以看出,這兩個都是連結檔案。

但是我們可以用ls -i命令檢視一下(-i引數可以顯示檔案的inode)。我們可以看到file1和file2的inode是一樣的,都是3022618。當然你的電腦上應該和我不一樣,是其他數字。

如果我們用rm file2來刪除file2,那麼對file1沒什麼影響。如果我們用rm file1來刪除file1,對file2也沒什麼影響。所以,對於硬連結來說,刪除任意一方的檔案,共同指向的檔案內容並不會從硬碟上被刪除。

只有既刪除file1又刪除file2,它們共同指向的檔案內容才會消失,也就是那個inode才會被刪去。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

我們用ls -l命令檢視檔案資訊的時候,第二列的那個2,其實是表示擁有相同inode號的檔案數。不難理解,因為它們指向相同的檔案內容,所以共享一個inode。

這個第二列的數字,一般來說對於普通檔案,都是1,因為不同檔案inode不同嘛。對於目錄來說,這第二列的數字標明目錄內所含檔案數目。

建立軟連結


其實,軟連結才是真正像我們在Windows下的快捷方式的,其原理很相似。

建立硬連結是ln不帶任何引數,但是要建立軟連結需要加上-s引數。s是symbolic(符號的)的縮寫。

因為之前我們的test目錄中,我們已經刪除了file2這個檔案。那麼我們再來建立file1的軟連結吧,還是命名為file2好了。

ln -s file1 file2複製程式碼

以上命令建立了file1的軟連結file2。

軟連結原理圖:

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

可以看到上圖中,file2指向的不再是file1的檔案內容(和硬連結不同),而是指向file1的檔名。

用ls -l命令檢視一下,會發現形式和之前的硬連結不一樣噢,file2的資訊是這樣的: file2->file1,表示file2指向file1。

而且file2前面的許可權那裡的第一個字母變成了l,表示link(連結)。之前硬連結的時候是沒有l的,硬連結外表看起來就和普通檔案類似。

我們用ls -l命令檢視檔案資訊的時候,第二列的那個1,表示擁有相同inode號的檔案數。不難理解,因為file2指向file1,它們並沒有指向同一塊檔案內容,所以它們的inode號不相同。

用ls -i看一下就知道了:

file1的inode號仍然是3022618,而file2的inode號是3022612,不一樣。

開啟file2檢視其內容,發現其內容和file1是一樣的。這不難理解,因為其實file2這個軟連結只是file1的一個快捷方式,它指向的是file1,所以顯示的是file1的內容。但其實它自身的inode和file1並不一樣,也就是檔案內容不一樣。

軟連結的特點:

  • 如果我們刪除了file2,沒什麼大不了,file1不會受到影響。但是如果刪除了file1,那麼file2會變成“死連結”,因為指向的檔案不見了。

  • 軟連結可以指向目錄,硬連結不行。

Linux 探索之旅 | 第二部分第四課:檔案操縱,股掌之中

可以看到,一旦刪除了file1,那麼file2就變成了紅色,是標明此軟連結已經損壞。因為file2指向的檔案file1已經被刪除,file2不知道要指向哪裡了。

硬連結和軟連結,我們大體上講完了。也許還是有點暈,不過可以參考一些課外讀物,加深理解。自己動手做做實驗,就會慢慢理解了。

總結


  1. cat命令用於顯示檔案的所有內容。不過如果檔案內容太多,最好用less命令,可以一頁一頁地顯示檔案。

  2. 我們可以用head和tail命令分別顯示檔案開頭和結尾的若干行。特別地,使用tail -f,我們可以實時地顯示檔案的變化,對於隨時間一直在改變的檔案,例如日誌(log)檔案特別有用。

  3. mkdir命令用於建立目錄。touch命令用於建立空檔案。使用mkdir -p,我們可以遞迴地建立目錄結構。

  4. cp命令用於拷貝檔案或目錄。mv命令用於移動檔案或目錄,也可以為檔案重新命名。

  5. rm命令用於刪除檔案或目錄。記住:終端裡可沒有“回收站”,所以刪除前要謹慎考慮。

  6. 我們使用ln命令,可以建立指向檔案的連結(類似Windows的快捷方式,但比快捷方式複雜)。

第二部分第五課預告


今天的課就到這裡,一起加油吧!

下一課我們學習:Linux探索之旅 | 第二部分第五課:使用者和許可權,有權就任性


微信公眾號「程式設計師聯盟」ProgrammerLeague
我是謝恩銘,在巴黎奮鬥的軟體工程師。
我的簡介
我的經歷
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:“向著標杆直跑”

相關文章