1. 程式人生 > 實用技巧 >8.Linux的目錄管理

8.Linux的目錄管理

3 Linux目錄管理

3.1 Linux 檔案與目錄管理

3.1.1 目錄常用命令

  • ls: 列出目錄

  • cd: 切換目錄

  • pwd: 顯示目前的目錄

  • mkdir:建立一個新的目錄

  • rmdir:刪除一個空的目錄

  • cp: 複製檔案或目錄

  • rm: 移除檔案或目錄

  • mv: 移動檔案與目錄或修改檔案與目錄的名稱

自動補全

  • 在敲出 檔案/ 目錄 / 命令 的前幾個字母之後, 按下 tab

  • 如果還存在其他 檔案 / 目錄 / 命令, 再按一下tab鍵, 系統會提示可能存在的命令

1) ls (列出目錄)

【檢視磁碟下的目錄與檔案】

【檢視資料夾下的目錄與檔案】

注意:在Linux系統當中, ls 命令算是比較常用的命令

使用者許可權:所有使用者都可使用。

語法如下:

ls [選項]  目錄名稱         列出目錄裡的內容

選項與引數:

  • -a :全部的檔案,連同隱藏檔( 開頭為 . 的檔案) 一起列出來(常用)

  • -d :僅列出目錄本身,而不是列出目錄內的檔案資料(常用)

  • -l :長資料串列出,包含檔案的屬性與許可權等等資料;(常用)

將根目錄下的所有檔案列出來(含屬性與隱藏檔)

 ls -al ~

執行效果如下

ls -l

ls -l 可以檢視資料夾下檔案的詳細資訊, 從左到右 依次是:

  • 許可權(A區域)

    , 第一個字元如果是 d 表示目錄 -表示檔案

  • 硬連結數(B區域), 通俗的講就是有多少種方式, 可以訪問當前目錄和檔案

  • 屬主(C區域), 檔案是所有者、或是叫做屬主

  • 屬組(D區域), 檔案屬於哪個組

  • 大小(E區域):檔案大小

  • 時間(F區域):最後一次訪問時間

  • 名稱(G區域):檔案的名稱 帶.的時隱藏的

ls

總結
以上三種是經常被使用到的命令
它們之間的區別是
ls 顯示不隱藏的檔案與資料夾
ls -l 顯示不隱藏的檔案與資料夾的詳細資訊
ls -al 顯示所有檔案與資料夾的詳細資訊

2) pwd顯示當前目錄

執行pwd命令相當於我們在Windows系統路徑導航欄中檢視到的當前瀏覽位置資訊

pwd 是 Print Working Directory 的縮寫,也就是顯示目前所在當前目錄的命令。

使用者許可權:所有使用者都可使用。

檢視當前所在目錄

pwd -P

執行效果如下

3) cd (切換目錄)

Linux的cd切換目錄,相當於我們在Windows中通過滑鼠或者快捷鍵點開不同的目錄

注意:在Linux系統當中, cd 命令算是比較常用的命令

cd是Change Directory的縮寫,這是用來變換工作目錄的命令

使用者許可權:所有使用者都可使用。

語法如下:

 cd [相對路徑或絕對路徑]               切換目錄

在正式學習cd命令前面,我們通過下面一個座點陣圖的形式講解下相對路徑和絕對路徑是怎麼表現的。

  • 絕對路徑: 路徑的寫法,由根目錄 / 寫起,例如: /usr/share/doc 這個目錄。

  • 相對路徑: 路徑的寫法,不是由 / 寫起,例如由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成: cd ../man 這就是相對路徑的寫法啦!

1、使用相對路徑定位目標

  • 特徵: 相對路徑 輸入路徑時, 最前面不是以 "/" 開始的, 表示相對 當前目錄 所在的位置

  • 缺點: 參照工作目錄 發生變化 相對路徑也要發生變化

需求1: 當前工作目錄是 /usr, 使用相對路徑 切換到 /usr/tmp 目錄下 

需求2: 當前工作目錄是 /root, 使用相對路徑 切換到 /usr/tmp 目錄下

執行效果如下

注意:
cd ~ 表示回到根目錄

2、使用絕對路徑定位目標

  • 特徵: 絕對路徑 在輸入路徑時, 最前面是以 / 開始的, 表示 從 根目錄 開始的具體目錄位置

  • 優點: 定位準確, 不會因為 工作目錄變化 而變化

需求1: 當前工作目錄是 /usr, 使用絕對路徑 切換到 /usr/tmp 目錄下 

需求2: 當前工作目錄是 /root, 使用絕對路徑 切換到 /usr/tmp 目錄下

執行效果如下

總結

  • 相對路徑 在輸入路徑時, 最前面不是以 / 開始的 , 表示相對 當前目錄 所在的目錄位置

  • 絕對路徑 在輸入路徑時, 最前面是以 / 開始的, 表示 從 根目錄 開始的具體目錄位置

4) mkdir(建立目錄)

引子:
Linux的mkdir命令相當於我們在Windows中通過滑鼠或者快捷鍵新建資料夾

mkdir命令用於建立名稱為 dirName 之子目錄

使用許可權:於目前目錄有適當許可權的所有使用者

語法

mkdir [-p] dirName            建立目錄

引數說明:

  • -p 確保目錄名稱存在,不存在的就建一個

建立一個名為jinyanlong 的子目錄

mkdir jinyanlong

執行效果如下

檢視新建的 檔案

在工作目錄下的 aaa目錄中,建立一個名為 bbb的子目錄。 若 aaa目錄原本不存在,則建立一個。(注:本例若不加 -p,且原本 aaa目錄不存在,則產生錯誤。)

mkdir -p aaa/bbb

執行效果如下

這裡為了顯示更直觀,我們使用了tree命令

後面在講解到yum的時候,會詳細講解

此處先使用

由上圖我們發現,aaa目錄被強制建立,裡面包含了bbb檔案。

5) rmdir(刪空目錄)

Linux的rmdir命令相當於我們在Windows中通過滑鼠或者快捷鍵刪除資料夾。
稍微有點不同的就是在Linux中刪除子目錄的時候,如果主目錄下沒有了目錄以及檔案,會連同主目錄同時刪除了(需要寫Linux帶有P的引數)

rmdir命令刪除空的目錄

使用許可權:於目前目錄有適當許可權的所有使用者。

語法

rmdir [-p] dirName

引數

  • -p 是當子目錄被刪除後使它也成為空目錄的話,則順便一併刪除。

將工作目錄下,名為 jinyanlong 的子目錄刪除 :

rmdir jinyanlong

在工作目錄下的 aaa目錄中,刪除名為 bbb的子目錄。若 bbb刪除後,aaa目錄成為空目錄,則 aaa同時也會被刪除

rmdir -p aaa/bbb

總結:

rmdir -p aaa/bbb也就是說

在刪除bbb目錄完成後,發現aaa目錄也是空目錄了,在刪除完bbb後aaa也同時被刪除了。

6) cp(檔案複製)

Linux的cp命令相當於我們在Windows中通過滑鼠或者快捷鍵複製檔案或者目錄

cp命令主要用於複製檔案或目錄。

使用許可權:於目前目錄有適當許可權的所有使用者

語法

cp [options] source dest      檔案複製

cp [options] source... directory

引數說明:

  • -a:此選項通常在複製目錄時使用,它保留連結、檔案屬性,並複製目錄下的所有內容。其作用等於dpR引數組合。

  • -d:複製時保留連結。這裡所說的連結相當於Windows系統中的快捷方式。

  • -f:覆蓋已經存在的目標檔案而不給出提示。

  • -i:與-f選項相反,在覆蓋目標檔案之前給出提示,要求使用者確認是否覆蓋,回答"y"時目標檔案將被覆蓋。

  • -p:除複製檔案的內容外,還把修改時間和訪問許可權也複製到新檔案中。

  • -r/R:若給出的原始檔是一個目錄檔案,此時將複製該目錄下所有的子目錄和檔案。

  • -l:不復制檔案,只是生成連結檔案。

我們將當前目錄"aaa/"下的所有目錄以及檔案複製到新目錄"ccc"下,輸入如下命令:

1、資料準備

建立aaa目錄並且aaa下包含bbb目錄

mkdir -p aaa/bbb
mkdir -p ccc
touch a.txt

執行效果如下

aaa目錄下有bbb

ccc下面沒有目錄和檔案

2、執行復制

cp –r aaa/*  ccc 

執行效果如下

我們將aaa下面的所有檔案、目錄複製到了目錄c下面包括檔案 包括資料夾

總結:

使用者使用該指令複製目錄時,必須使用引數"-r"或者"-R"。

如果不加引數"-r"或者"-R",只複製檔案,而略過目錄

7) rm(刪除目錄)

Linux的rm命令相當於我們在Windows中通過滑鼠或者快捷鍵刪除檔案或者目錄

rm命令用於刪除一個檔案或者目錄。

使用許可權:於目前目錄有適當許可權的所有使用者

語法

rm [options] name...       刪除檔案或者目錄

引數:

  • -i 刪除前逐一詢問確認。

  • -f 即使原檔案屬性設為唯讀,亦直接刪除,無需逐一確認。

  • -r 將目錄及以下之檔案亦逐一刪除。

如果我們要刪除檔案可以直接使用rm命令,若刪除目錄則必須配合選項"-r",例如:

rm -r ccc

執行刪除,如下圖

注意

檔案一旦通過rm命令刪除,則無法恢復,所以必須格外小心地使用該命令

如果刪除檔案(比如.sh 、.txt)

直接使用rm name.txt

8) mv(移動檔案)

Linux的mv命令相當於我們在Windows中通過滑鼠或者快捷鍵剪下(+重新命名)+貼上檔案或者目錄

mv 命令用來為檔案或目錄改名、或將檔案或目錄移入其它位置

語法

mv [options] source dest
mv [options] source... directory
mv 資料來源 目的地 改名移動

引數說明:

  • -i: 若指定目錄已有同名檔案,則先詢問是否覆蓋舊檔案;

  • -f: 在 mv 操作要覆蓋某已有的目標檔案時不給任何指示;

將檔案 aaa 更名為 bbb :

1、建立aaa目錄、
mkdir aaa
2、開始重新命名
mv aaa bbb

執行後

將ccc目錄放入ddd目錄中。

注意,如果ddd目錄不存在,則該命令將ccc改名為ddd。

建立ccc
mkdir ccc

開始移動
mv ccc/ ddd

由上圖我們發現,由於ddd目錄不存在,所以在mv的時候將ccc目錄改名為了ddd。

3.2 Linux 檔案基本屬性

在Wndows系統中,我們可以選中一個檔案,右鍵屬性,可以檢視到這個檔案的檔案型別(基本資訊),以及檔案的許可權資訊,在Linux中,它是通過不同字元的排序順序來表示檔案的型別以及許可權所屬資訊的。

Linux系統是一種典型的多使用者系統,不同的使用者處於不同的地位,擁有不同的許可權。為了保護系統的安全性,Linux系統對不同的使用者訪問同一檔案(包括目錄檔案)的許可權做了不同的規定。

下面我們就一起學習下Linux系統不同許可權的檔案和目錄在怎麼表示的

在Linux中我們可以使用ll或者ls –l命令來顯示一個檔案的屬性以及檔案所屬的使用者和組,如:

ls -l

例項中,bin檔案的第一個屬性用"d"表示。"d"在Linux中代表該檔案是一個目錄檔案。

在Linux中第一個字元代表這個檔案是目錄、檔案或連結檔案等等。

  • 當為[ d ]則是目錄

  • 當為[ - ]則是檔案;

  • 若是[ l ]則表示為連結文件(link file);

  • 若是[ b ]則表示為裝置檔案裡面的可供儲存的介面裝置(可隨機存取裝置);

  • 若是[ c ]則表示為裝置檔案裡面的串列埠裝置,例如鍵盤、滑鼠(一次性讀取裝置)。

接下來的字元中,以三個為一組,且均為『rwx』 的三個引數的組合。其中,[ r ]代表可讀(read)、[ w ]代表可寫(write)、[ x ]代表可執行(execute)。 要注意的是,這三個許可權的位置不會改變,如果沒有許可權,就會出現減號[ - ]而已。

每個檔案的屬性由左邊第一部分的10個字元來確定(如下圖)。

從左至右用0-9這些數字來表示。

第0位確定檔案型別,第1-3位確定屬主(該檔案的所有者)擁有該檔案的許可權。

第4-6位確定屬組(所有者的同組使用者)擁有該檔案的許可權第7-9位確定其他使用者擁有該檔案的許可權。

其中,第1、4、7位表示讀許可權,如果用"r"字元表示,則有讀許可權,如果用"-"字元表示,則沒有讀許可權;

第2、5、8位表示寫許可權,如果用"w"字元表示,則有寫許可權,如果用"-"字元表示沒有寫許可權;第3、6、9位表示可執行許可權,如果用"x"字元表示,則有執行許可權,如果用"-"字元表示,則沒有執行許可權。

3.3 Linux檔案屬主和屬組

引子:
對於一個檔案來說,它都有一個特定的所有者,也就是對該檔案具有所有權的使用者。
也就是所謂的屬主,它屬於哪個使用者的意思。
除了屬主,還有屬組,也就是說,這個檔案是屬於哪個組的(使用者所屬的組)。
檔案的【屬主】有一套【讀寫執行許可權rwx】
檔案的【屬組】有一套【讀寫執行許可權rwx】
還有它許可權,下面我們在介紹

在以上例項中,aaa檔案是一個目錄檔案,屬主和屬組都為 itcast,屬主有可讀、可寫、可執行的許可權(rwx);與屬主同組的其他使用者有可讀可寫和可執行的許可權(rwx);其他使用者也有可讀和可執行的許可權(r-x)。

3.3.1 chgrp更改屬組

實際開發中我們經常會建立新建目錄和檔案,一般情況下,通過命令進行新建,
在建立完成後,使用不同的使用者訪問,可能就會出現報錯,無法訪問等等問題。
然後經過一番這查詢,發現該有的檔案都在,大小寫也沒問題,路徑也沒問題
其實並不是這些問題。而是許可權問題導致我們無法訪問!是因為一個檔案預設隸屬於一個屬組,而使用其他使用者訪問這個檔案肯定無法訪問(因為訪問使用者所屬的組和檔案所在的不是同一個組)
那麼怎麼可以正常訪問呢?其實就是通過更改使用者組(使用者組、檔案組)來解決這些問題

chgrp命令用於變更檔案或目錄的所屬群組。

檔案或目錄許可權的的擁有者由所屬群組來管理。您可以使用chgrp指令去變更檔案與目錄的所屬群組,設定方式採用群組名稱或群組識別碼皆可

為了方便初學者記憶,可以將 chgrp 理解為是 "change group" 的縮寫

語法如下

chgrp [-cfhRv][--help][--version][所屬群組][檔案或目錄...] 或 chgrp [-cfhRv][--help][--reference=<參考檔案或目錄>][--version][檔案或目錄...]

改變檔案的群組屬性

我們通過root使用者進入(如下圖),上接上面的例子

我們的aaa檔案的屬主和屬組都屬於itcast(如下圖)

我們現在通過chgrp命令將檔案aaa的屬組更改成root(其他也可以)

chgrp -v root aaa

執行效果如下

我們通過下面的命令查詢檔案aaa的屬組是否發生了變化,執行

ls -l

由上圖我們發現,檔案aaa的屬組由itcast變成了root

這樣的話,檔案的屬組就發生了變化。

3.3.2 chown更改屬主和屬組**

我們為了讓一些使用者有許可權檢視某一文件,比如是一個時間表,而編寫時間表的人要具有讀寫執行的許可權(屬主)
我們想讓一些使用者知道這個時間表的內容,而不讓他們修改,所以我們可以把這些使用者都劃到一個組(屬組),然後來修改這個檔案的許可權,讓使用者組可讀,這樣使用者組下面的每個使用者都是可讀的

Linux是多工作業系統,所有的檔案皆有擁有者。利用 chown 可以將檔案的擁有者加以改變。一般來說,這個指令只有是由系統管理者(root)所使用,一般使用者沒有許可權可以改變別人的檔案擁有者,也沒有許可權可以自己的檔案擁有者改設為別人。只有系統管理者(root)才有這樣的許可權

使用許可權 : 管理員賬戶

語法如下

chown [–R] 屬主名 檔名              更改屬主
chown [-R] 屬主名:屬組名 檔名     更改屬主和屬組

我們通過root使用者進入(如下圖),上接上面的例子

我們的aaa檔案的屬主屬於itcast、屬組屬於root

我們現在通過chgrp命令將檔案aaa的屬主更改成root,執行

 chown  root aaa

-R 處理指定目錄以及其子目錄下的所有檔案

效果如下

我們通過下面的命令查詢檔案aaa的屬主是否發生了變化,執行

ls -l

由上圖我們發現,檔案aaa的屬主和屬組都變成了root。

我們將aaa檔案的擁有者與群組改回為itcast:

注意:chown命令可以更改屬主和屬組

chown itcast:itcast aaa

我們通過下面的命令查詢檔案aaa的屬主是否發生了變化,執行

ls -l

由上圖可知,aaa檔案的屬主和屬組都被更改回來了。

chown -R root:root bbb 將aaa資料夾和裡面所有的屬主和屬組改為root

3.3.3 chmod許可權命令

   作用:修改屬主,屬組,其他使用者的許可權

Linux檔案屬性有兩種設定方法,一種是數字,一種是符號

Linux的檔案呼叫許可權分為三級 : 檔案屬主、屬組、其他。利用 chmod 可以控制檔案如何被他人所呼叫。

使用許可權 : 所有使用者

語法

chmod [-cfvR] [--help] [--version] mode file...

引數說明

mode : 許可權設定字串,格式如下

[ugoa...][[+-=][rwxX]...][,...]

解釋:

u 表示該檔案的擁有者,g 表示與該檔案的擁有者屬於同一個群體(group)者,o 表示其他以外的人,a 表示這三者皆是。

+表示增加許可權、- 表示取消許可權、= 表示唯一設定許可權。 r 表示可讀取,w 表示可寫入,x 表示可執行,X 表示只有當該檔案是個子目錄或者該檔案已經被設定過為可執行。

1) 數字許可權

Linux檔案的基本許可權就有九個,分別是owner/group/others三種身份各有自己的read/write/execute許可權。

先複習一下剛剛上面提到的資料:檔案的許可權字元為:『-rwxrwxrwx』, 這九個許可權是三個三個一組(owner/group/others就是所說的三個一組 )的,我們也可以使用數字來代表各個許可權,各許可權的分數對照表如下

各許可權的數字對照表:[r]:4;[w]:2;[x]:1;[-]:0

每種身份(owner/group/others)各自的三個許可權(r/w/x)分數是需要累加的,例如當權限為: [-rwxrwx---] 分數則是:

  • owner = rwx = 4+2+1 = 7

  • group = rwx = 4+2+1 = 7

  • others= --- = 0+0+0 = 0

所以等一下我們設定許可權的變更時,該檔案的許可權數字就是770啦,變更許可權的指令chmod的語法是這樣的

chmod [-R] xyz 檔案或目錄

選項與引數:

  • xyz : 就是剛剛提到的數字型別的許可權屬性,為 rwx 屬性數值的相加。

  • -R : 進行遞迴(recursive)的持續變更,亦即連同次目錄下的所有檔案都會變更

  • 數字許可權:就是剛剛提到的數字型別的許可權屬性,位rwx對應數值相加的和

上面的 可以表示如下

chmod -R 770   檔案或目錄

上面說了這麼多,我們舉例說明一下:

我們進入itcast使用者建立檔案czbk.txt

touch as.txt

然後切換到root

比如,我們如果要將as.txt這個檔案所有的許可權都設定啟用

那麼命令如下:

chmod -R 777 as.txt

由此可見,as.txt的屬主許可權、屬組許可權、其他許可權都發生了改變

由之前的【-rw-rw-r--】變成【-rwxrwxrwx】

根據前面的換算我們已經知道如何將一個檔案的屬主、屬組、其他許可權換算成數字了,換算成數字後,我們只需要通過chmod命令即可更改檔案的許可權

2) 符號許可權

還有一個改變許可權的方法,就是 符號許可權,我們先回顧下之前提到的9個許可權

舉例:

chmod -R 770 aaa

chmod -R 符號許可權 aaa

  • (1)user 屬主許可權

  • (2)group 屬組許可權

  • (3)others 其他許可權

那麼我們就可以使用 u, g, o 來代表三種身份的許可權!

此外, a 則代表 all,即全部的身份。讀寫的許可權可以寫成 r, w, x,也就是可以使用下表的方式來看

如果我們需要將檔案許可權設定為 -rwxr-xr-- ,可以使用 chmod u=rwx,g=rx,o=r 檔名 來設定:

上接上面的例子,如下圖

我們將as.txt的許可權設定為-rwxr-xr--

chmod u=rwx,g=rx,o=r  as.txt

由上圖我們發現,as.txt的許可權變成了-rwxr-xr--

假如我們要將許可權去掉而不改變其他已存在的許可權呢?舉個例子,比如我要拿掉全部人的可讀許可權,則

 chmod  a-r as.txt

執行如下

由此可見,as.txt的其他許可權都沒有了,變成了【---】

3.4 綜合案例

在前面的章節中我們講解了使用者、使用者組、檔案屬主、屬組以及許可權,知識點比較零散,下面,我們就通過一個簡單小案例把這些知識點串聯起來

需求:

比如一個公司的開發團隊有三個使用者:java、erlang、golang有一個檔案目錄tmp/work供他們開發,如何實現讓這三個使用者都對其具有寫許可權

1、首先,我們建立三個賬戶(切換到root)

adduser java
adduser erlang
adduser golang

執行效果如下

2、增加使用者組

groupadd -g 8888 dev-group

執行效果如下

3、建立公共檔案並設定許可權

給檔案/tmp/project2019/設定屬組為dev-group

 mkdir /tmp/project2019

chown -R :dev-group /tmp/project2019/
或者
chgrp -R dev-group /tmp/project2019/

執行效果如下

4、將使用者新增到組

gpasswd -a java   dev-group
gpasswd -a erlang dev-group
gpasswd -a golang dev-group

執行效果如下

查詢dev-group組下所有使用者

 grep 'dev-group' /etc/group

執行效果如下

5、切換到java使用者

切換到java使用者看看是否有寫入許可權

su java

新建檔案

在我們上面建立的目錄tmp/project2019/下面建立檔案

mkdir java-files-new

由此發現,我們在tmp/project2019/下面建立檔案發生了許可權不足,我們去檢視下tmp/project2019/的檔案屬性,如下圖

我們在/tmp目錄下執行

ls -l

執行效果如下

我們發現目錄project2019的檔案屬性為【drwxr-xr-x】

根據前面學的知識,我們拆分如下

【d】:檔案型別

【rwx】:屬主

【r-x】:屬組

【r-x】:其他

現在答案就出來了,也就是說我們的屬組許可權是【r-x】,只有讀和執行許可權,沒有寫入許可權,那麼下面我們就給project2019目錄增加寫入許可權。

、增加寫入許可權

給project2019目錄增加寫入許可權,執行下面的命令(前面已經學習過了)

記得切換到root下執行

chmod -R 770  project2019

執行效果如下

此時我們發現project2019目錄的屬組許可權變成了【rwx】即可讀、可寫、可執行

7、切換使用者,繼續寫入

su  java
mkdir java-files-new
ls -l

執行效果如下

由此發現,這個時候我們有了寫入許可權,java-files-new檔案被成功寫入

那麼,其他兩個使用者golang、erlang也是和java一個組的,他們能不能正常寫入呢,我們試試(從root切換過去)

su
su erlang
mkdir erlang-files-new
==============================
su
su golang
mkdir golang-files-new

ls -l

執行效果(erlang新建檔案)

執行效果(golanglang新建檔案)

檢視所有檔案

由此可見,我們組的三個使用者都成功建立了檔案(擁有了寫入許可權)

8、驗證結論

為了驗證上面的結論,我們新增一個使用者itbeijing

看看能否正常新建檔案

useradd  itbeijing
su itbeijing
mkdir itbeijing-files-new

執行效果如下

由上圖我們發現,我們剛剛新建立的使用者在建立檔案的時候發現了許可權不足。

由此說明使用者itbeijing使用者的屬組和檔案的屬組不一樣,所以沒有許可權。

3.5 總結

在企業級開發過程中,實際操作目錄是最經常出現的,對於目錄常用命令我們要熟練掌握並能熟練編寫 因為Linux是多使用者系統,所以許可權也是非常核心和重要的,我們要熟練編寫許可權(屬主、屬組、其他許可權)的常用命令。