Linux目錄文件基本命令


Linux 命令按照來源方式,可分爲兩種,分別是 Shell 內置命令和外部命令。所謂 Shell 內置命令,就是 Shell 自帶的命令,這些命令是沒有執行文件的;而外部命令就是由程序員單獨開發的,因此會有命令的執行文件。

命令縮寫規則:

刪除元音字母(aeiou),保留前2-3個輔音字母,如
在這裏插入圖片描述java

cd命令:切換目錄

cd 命令,是 Change Directory 的縮寫,用來切換工做目錄。
cd 命令的基本格式以下:node

[root@localhost ~]# cd [相對路徑或絕對路徑]

在這裏插入圖片描述

[root@localhost ~]# cd
#沒有加上任何路徑,也表明回到當前登陸用戶的主目錄

pwd命令:顯示當前路徑

pwd 命令,是 Print Working Directory (打印工做目錄)的縮寫,功能是顯示用戶當前所處的工做目錄。
該命令的基本格式爲:程序員

[root@localhost ~]# pwd

ls命令:查看目錄下文件

ls 命令,list 的縮寫,是最多見的目錄操做命令,其主要功能是顯示當前目錄下的內容。
此命令的基本格式爲:web

[root@localhost ~]# ls [選項] 目錄名稱

注意,當 ls 命令不使用任何選項時,默認只會顯示非隱藏文件的名稱,並以文件名進行排序,同時會根據文件的具體類型給文件名配色(藍色顯示目錄,白色顯示通常文件)。
在這裏插入圖片描述
注意,Linux 系統中,隱藏文件不是爲了把文件藏起來不讓其餘用戶找到,而是爲了告訴用戶這些文件都是重要的系統文件,如非必要,不要亂動!svg

mkdir命令:建立目錄(文件夾)

mkdir 命令,是 make directories 的縮寫,用於建立新目錄,此命令全部用戶均可以使用。
mkdir 命令的基本格式爲:學習

[root@localhost ~]# mkdir [-mp] 目錄名
  • -m 選項用於手動配置所建立目錄的權限,而再也不使用默認權限。
  • -p 選項遞歸建立全部目錄,以建立 /home/test/demo 爲例,在默認狀況下,你須要一層一層的建立各個目錄,而使用 -p 選項,則系統會自動幫你建立 /home、/home/test 以及 /home/test/demo。

rmdir命令:刪除空目錄

rmdir(remove empty directories 的縮寫)命令用於刪除空目錄,
此命令的基本格式爲:spa

[root@localhost ~]# rmdir [-p] 目錄名

-p 選項用於遞歸刪除空目錄。
例:3d

[root@localhost ~]# rmdir -p lm/movie/jp/cangls

注意,此方式先刪除最低一層地目錄(這裏先刪除 cangls),而後逐層刪除上級目錄,刪除時也須要保證各級目錄是空目錄。
rmdir 命令的做用十分有限,由於只能刪除空目錄,因此一旦目錄中有內容,就會報錯。code

touch命令:建立文件及修改文件時間戳

touch 命令不光能夠用來建立文件(當指定操做文件不存在時,該命令會在當前位置創建一個空文件),此命令更重要的功能是修改文件的時間參數(但當文件存在時,會修改此文件的時間參數)。
touch 命令的基本格式以下:xml

[root@localhost ~]# touch [選項] 文件名

選項:

  • -a:只修改文件的訪問時間;
  • -c:僅修改文件的時間參數(3 個時間參數都改變),若是文件不存在,則不創建新文件。
  • -d:後面能夠跟欲修訂的日期,而不用當前的日期,即把文件的 atime 和 mtime 時間改成指定的時間。
  • -m:只修改文件的數據修改時間。
  • -t:命令後面能夠跟欲修訂的時間,而不用目前的時間,時間書寫格式爲 YYMMDDhhmm。

能夠看到,touch 命令能夠只修改文件的訪問時間,也能夠只修改文件的數據修改時間,可是不能只修改文件的狀態修改時間。由於,不管是修改訪問時間,仍是修改文件的數據時間,對文件來說,狀態都會發生改變,即狀態修改時間會隨之改變(更新爲操做當前文件的真正時間)。

Linux 系統中,每一個文件主要擁有 3 個時間參數(經過 stat 命令進行查看),分別是文件的訪問時間、數據修改時間以及狀態修改時間:

  • 訪問時間(Access Time,簡稱 atime):只要文件的內容被讀取,訪問時間就會更新。例如,使用 cat 命令能夠查看文件的內容,此時文件的訪問時間就會發生改變。
  • 數據修改時間(Modify Time,簡稱 mtime):當文件的內容數據發生改變,此文件的數據修改時間就會跟着相應改變。
  • 狀態修改時間(Change Time,簡稱 ctime):當文件的狀態發生變化,就會相應改變這個時間。好比說,若是文件的權限或者屬性發生改變,此時間就會相應改變。

ln命令:在文件之間創建連接

ln命令:在文件之間創建連接(硬連接和軟連接)

ext 文件系統(Linux 文件系統)

要想說清楚 ln 命令,則必須先解釋下 ext 文件系統(Linux 文件系統)是如何工做的。咱們在前面講解了分區的格式化就是寫入文件系統,而咱們的 Linux 目前使用的是 ext4 文件系統。若是用一張示意圖來描述 ext4 文件系統,則能夠參考圖 1。
在這裏插入圖片描述
ext4 文件系統會把分區主要分爲兩大部分(暫時不提超級塊):小部分用於保存文件的 inode (i 節點)信息;剩餘的大部分用於保存 block 信息。

inode 的默認大小爲 128 Byte,用來記錄文件的權限(r、w、x)、文件的全部者和屬組、文件的大小、文件的狀態改變時間(ctime)、文件的最近一次讀取時間(atime)、文件的最近一次修改時間(mtime)、文件的數據真正保存的 block 編號。每一個文件須要佔用一個 inode。你們若是仔細查看,就會發現 inode 中是不記錄文件名的,那是由於文件名記錄在文件所在目錄的 block 中。

block 的大小能夠是 1KB、2KB、4KB,默認爲 4KB。block 用於實際的數據存儲,若是一個 block 放不下數據,則能夠佔用多個 block。例如,有一個 10KB 的文件須要存儲,則會佔用 3 個 block,雖然最後一個 block 不能佔滿,但也不能再放入其餘文件的數據。這 3 個 block 有多是連續的,也有多是分散的。

由此,咱們能夠知道如下 2 個重要的信息:
每一個文件都獨自佔用一個 inode,文件內容由 inode 的記錄來指向;
若是想要讀取文件內容,就必須藉助目錄中記錄的文件名找到該文件的 inode,才能成功找到文件內容所在的 block 塊;

瞭解了 Linux 系統底層文件的存儲狀態後,接下來學習 ln 命令。

ln 命令用於給文件建立連接,根據 Linux 系統存儲文件的特色,連接的方式分爲如下 2 種:

  • 軟連接:相似於 Windows 系統中給文件建立快捷方式,即產生一個特殊的文件,該文件用來指向另外一個文件,此連接方式一樣適用於目錄。
  • 硬連接:咱們知道,文件的基本信息都存儲在 inode 中,而硬連接指的就是給一個文件的 inode 分配多個文件名,經過任何一個文件名,均可以找到此文件的 inode,從而讀取該文件的數據信息。

ln 命令的基本格式以下:

[root@localhost ~]# ln [選項] 源文件 目標文件

選項:

  • -s:創建軟連接文件。若是不加 「-s」 選項,則創建硬連接文件;
  • -f:強制。若是目標文件已經存在,則刪除目標文件後再創建連接文件;

ln建立連接的深度剖析

創建硬連接和軟連接很是簡單,那這兩種連接有什麼區別?它們都有什麼做用?這纔是連接文件最不容易理解的地方,咱們分別來說講。
ln建立硬連接
咱們再來創建一個硬連接文件,而後看看這兩個文件的特色。

[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 619 10:06 /root/test
hard
262147 -rw-r--r-- 2 root root 0 619 10:06 /tmp/test-hard
#查看兩個文件的詳細信息,能夠發現這兩個文件的 inode 號是同樣的,"ll"等同於"ls -l"

這裏有一件很奇怪的事情,咱們以前在講 inode 號的時候說過,每一個文件的 inode 號都應該是不同的。inode 號就至關於文件 ID,咱們在查找文件的時候,要先查找 inode 號,才能讀取到文件的內容。

可是這裏源文件和硬連接文件的 inode 號竟然是同樣的,那咱們在查找文件的時候,到底找到的是哪個文件呢?咱們來畫一張示意圖,如圖 2 所示。
在這裏插入圖片描述
在 inode 信息中,是不會記錄文件名稱的,而是把文件名記錄在上級目錄的 block 中。也就是說,目錄的 block 中記錄的是這個目錄下全部一級子文件和子目錄的文件名及 inode 的對應;而文件的 block 中記錄的纔是文件實際的數據。

當咱們查找一個文件,好比 /root/test 時,要通過如下步驟:

  1. 首先找到根目錄的 inode(根目錄的 inode 是系統已知的,inode 號是 2),而後判斷用戶是否有權限訪問根目錄的 block。
  2. 若是有權限,則能夠在根目錄的 block 中訪問到 /root 的文件名及對應的 inode 號。
  3. 經過 /root/ 目錄的 inode 號,能夠查找到 /root/ 目錄的 inode 信息,接着判斷用戶是否有權限訪問 /root/ 目錄的 block。
  4. 若是有權限,則能夠從 /root/ 目錄的 block 中讀取到 test 文件的文件名及對應的 inode 號。
  5. 經過 test 文件的 inode 號,就能夠找到 test 文件的 inode 信息,接着判斷用戶是否有權限訪問 test 文件的 block。
  6. 若是有權限,則能夠讀取 block 中的數據,這樣就完成了 /root/test 文件的讀取與訪問。

按照這個步驟,在給源文件 /root/test 創建了硬連接文件 /tmp/test-hard 以後,在 /root/ 目錄和 /tmp/ 目錄的 block 中就會創建 test 和 test-hard 的信息,這個信息主要就是文件名和對應的 inode 號。可是咱們會發現 test 和 test-hard 的 inode 信息竟然是同樣的,那麼,咱們不管訪問哪一個文件,最終都會訪問 inode 號是 262147 的文件信息。

這就是硬連接的原理。硬連接的特色以下:

  • 不管是修改源文件(test 文件),仍是修改硬連接文件(test-hard 文件),另外一個文件中的數據都會發生改變。
  • 不管是刪除源文件,仍是刪除硬連接文件,只要還有一個文件存在,這個文件(inode 號是 262147 的文件)均可以被訪問。
  • 硬連接不會創建新的 inode 信息,也不會更改 inode 的總數。
  • 硬連接不能跨文件系統(分區)創建,由於在不一樣的文件系統中,inode 號是從新計算的。
  • 硬連接不能連接目錄,由於若是給目錄創建硬連接,那麼不只目錄自己須要從新創建,目錄下全部的子文件,包括子目錄中的全部子文件都須要創建硬連接,這對當前的 Linux 來說過於複雜。

硬連接的限制比較多,既不能跨文件系統,也不能連接目錄,並且源文件和硬連接文件之間除 inode 號是同樣的以外,沒有其餘明顯的特徵。這些特徵都使得硬連接並不經常使用,你們有所瞭解就好。

ln建立軟連接
軟連接也稱做符號連接,相比硬連接來說,軟連接就要經常使用多了。咱們先創建一個軟連接,再來看看軟連接的特色。

[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 619 11:30 /root/check
917507 lrwxrwxrwx 1 root root 11 619 11:31 /tmp/ check-soft -> /root/check
#軟連接和源文件的 inode 號不一致,軟連接經過 -> 明顯地標識出源文件的位置
#在軟連接的權限位 lrwxrwxrwx 中,l 就表明軟連接文件

再強調一下,軟連接的源文件必須寫絕對路徑,不然創建的軟連接文件就會報錯,沒法正常使用。

軟連接的標誌很是明顯,首先,權限位中"l"表示這是一個軟連接文件;其次,在文件的後面經過 「->」 顯示出源文件的完整名字。因此軟連接比硬連接的標誌要明顯得多,並且軟連接也不像硬連接的限制那樣多,好比軟連接能夠連接目錄,也能夠跨分區來創建軟連接。

軟連接徹底能夠看成 Windows 的快捷方式來對待,它的特色和快捷方式同樣,咱們更推薦你們使用軟連接,而不是硬連接。

你們在學習軟連接的時候會有一些疑問:Windows 的快捷方式是因爲源文件放置的位置過深,不容易找到,創建一個快捷方式放在桌面,方便查找,那 Linux 的軟連接的做用是什麼呢?

筆者我的以爲,軟連接主要是爲了照顧管理員的使用習慣。好比,有些系統的自啓動文件 /etc/rc.local 放置在 /etc 目錄中,而有些系統卻將其放置在 /etc/rc.d/rc.local 中,那麼幹脆對這兩個文件創建軟連接,不論你習慣操做哪個文件,結果都是同樣的。

若是你比較細心,則應該已經發現軟連接和源文件的 inode 號是不一致的,咱們也畫一張示意圖來看看軟連接的原理,如圖 3 所示。
在這裏插入圖片描述
軟連接和硬連接在原理上最主要的不一樣在於:硬連接不會創建本身的 inode 索引和 block(數據塊),而是直接指向源文件的 inode 信息和 block,因此硬連接和源文件的 inode 號是一致的;而軟連接會真正創建本身的 inode 索引和 block,因此軟連接和源文件的 inode 號是不一致的,並且在軟連接的 block 中,寫的不是真正的數據,而僅僅是源文件的文件名及 inode 號

咱們來看看訪問軟連接的步驟和訪問硬連接的步驟有什麼不一樣。

  • 首先找到根目錄的 inode 索引信息,而後判斷用戶是否有權限訪問根目錄的 block。
  • 若是有權限訪問根目錄的 block,就會在 block 中查找到 /tmp/ 目錄的 inode 號。
  • -接着訪問 /tmp/ 目錄的 inode 信息,判斷用戶是否有權限訪問 /tmp/ 目錄的 block。
  • 若是有權限,就會在 block 中讀取到軟連接文件 check-soft 的 inode 號。由於軟連接文件會真正創建本身的 inode 索引和 block,因此軟連接文件和源文件的 inode 號是不同的。
  • 經過軟連接文件的 inode 號,找到了 check-soft 文件 inode 信息,判斷用戶是否有權限訪問 block。
  • 若是有權限,就會發現 check-soft 文件的 block 中沒有實際數據,僅有源文件 check 的 inode 號。
  • 接着經過源文件的 inode 號,訪問到源文件 check 的 inode 信息,判斷用戶是否有權限訪問 block。
  • 若是有權限,就會在 check 文件的 block 中讀取到真正的數據,從而完成數據訪問。

經過這個過程,咱們就能夠總結出軟連接的特色(軟連接的特色和 Windows 中的快捷方式徹底一致)

  • 不管是修改源文件(check),仍是修改硬連接文件(check-soft),另外一個文件中的數據都會發生改變。
  • 刪除軟連接文件,源文件不受影響。而刪除原文件,軟連接文件將找不到實際的數據,從而顯示文件不存在。
  • 軟連接會新建本身的 inode 信息和 block,只是在 block 中不存儲實際文件數據,而存儲的是源文件的文件名及 inode 號。
  • 軟連接能夠連接目錄。
  • 軟連接能夠跨分區。

cp命令:複製文件和目錄

cp 命令,主要用來複制文件和目錄,同時藉助某些選項,還能夠實現複製整個目錄,以及比對兩文件的新舊而予以升級等功能。

cp 命令的基本格式以下:

[root@localhost ~]# cp [選項] 源文件 目標文件

選項:

  • -a:至關於 -d、-p、-r 選項的集合,這幾個選項咱們一一介紹;
  • -d:若是源文件爲軟連接(對硬連接無效),則複製出的目標文件也爲軟連接;
  • -i:詢問,若是目標文件已經存在,則會詢問是否覆蓋;
  • -l:把目標文件創建爲源文件的硬連接文件,而不是複製源文件;
  • -s:把目標文件創建爲源文件的軟連接文件,而不是複製源文件;
  • -p:複製後目標文件保留源文件的屬性(包括全部者、所屬組、權限和時間);
  • -r:遞歸複製,用於複製目錄;
  • -u:若目標文件比源文件有差別,則使用該選項能夠更新目標文件,此選項可用於對文件的升級和備用。

須要注意的是,源文件能夠有多個,但這種狀況下,目標文件必須是目錄才能夠。

-d: 若是源文件爲軟連接(對硬連接無效),則複製出的目標文件也爲軟連接,相似Windows中對快捷方式進行復制;
若是在複製軟連接文件時不使用 「-d」 選項,則 cp 命令複製的是源文件,而不是軟連接文件;
「-d」 選項對硬連接是無效的。

rm命令:刪除文件或目錄

rm 是強大的刪除命令,它能夠永久性地刪除文件系統中指定的文件或目錄。在使用 rm 命令刪除文件或目錄時,系統不會產生任何提示信息。此命令的基本格式爲:

[root@localhost ~]# rm[選項] 文件或目錄

選項:

  • -f:強制刪除(force),和 -i 選項相反,使用 -f,系統將再也不詢問,而是直接刪除目標文件或目錄。
  • -i:和 -f 正好相反,在刪除文件或目錄以前,系統會給出提示信息,使用 -i 能夠有效防止不當心刪除有用的文件或目錄。
  • -r:遞歸刪除,主要用於刪除目錄,可刪除指定目錄及包含的全部內容,包括全部的子目錄和文件。

注意,rm 命令是一個具備破壞性的命令,由於 rm 命令會永久性地刪除文件或目錄,這就意味着,若是沒有對文件或目錄進行備份,一旦使用 rm 命令將其刪除,將沒法恢復,所以,尤爲在使用 rm 命令刪除目錄時,要慎之又慎。

雖然 「-rf」 選項是用來刪除目錄的,可是刪除文件也不會報錯。因此,爲了使用方便,通常不管是刪除文件仍是刪除目錄,都會直接使用 「-rf」 選項。

mv命令:移動文件或更名

mv 命令(move 的縮寫),既能夠在不一樣的目錄之間移動文件或目錄,也能夠對文件和目錄進行重命名。
該命令的基本格式以下:

[root@localhost ~]# mv 【選項】 源文件 目標文件

選項:

  • -f:強制覆蓋,若是目標文件已經存在,則不詢問,直接強制覆蓋;
  • -i:交互移動,若是目標文件已經存在,則詢問用戶是否覆蓋(默認選項);
  • -n:若是目標文件已經存在,則不會覆蓋移動,並且不詢問用戶;
  • -v:顯示文件或目錄的移動過程;
  • -u:若目標文件已經存在,但二者相比,源文件更新,則會對目標文件進行升級;

須要注意的是,同 rm 命令相似,mv 命令也是一個具備破壞性的命令,若是使用不當,極可能給系統帶來災難性的後果。

更名。
若是源文件和目標文件在同一目錄中,那就是更名。例如:

[root@localhost ~]# mv bols lmls
#把 bols 更名爲 lmls

目錄也能夠按照一樣的方法更名。