【Linux】常用指令
- 目錄管理
- 基本屬性
- 檔案内容檢視
目錄管理
絕對路徑和相對路徑
我們知道Linux的目錄結構為樹狀結構,最頂級的目錄為根目錄 /。
其他目錄通過挂載可以将它們添加到樹中,通過解除挂載可以移除它們。
在開始本教程前我們需要先知道什麼是絕對路徑與相對路徑。
絕對路徑:
路徑的寫法,由根目錄 / 寫起,例如:/usr/share/doc 這個目錄。
相對路徑:
路徑的寫法,不是由 / 寫起,例如由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成:cd …/man 這就是相對路徑的寫法啦!
處理目錄的常用指令
接下來我們就來看幾個常見的處理目錄的指令吧:
- ls: 列出目錄
- cd:切換目錄
- pwd:顯示目前的目錄
- rmdir:删除一個空的目錄
- cp: 複制檔案或目錄
- rm: 移除檔案或目錄
- mv: 移動檔案與目錄,或修改檔案與目錄的名稱
你可以使用 man [指令] 來檢視各個指令的使用文檔,如 :man cp。
ls (列出目錄)
在Linux系統當中, ls 指令可能是最常被運作的。
文法:
選項與參數:
-a :全部的檔案,連同隐藏檔案( 開頭為 . 的檔案) 一起列出來(常用)
-l :長資料串列出,包含檔案的屬性與權限等等資料;(常用)
将目錄下的所有檔案列出來(含屬性與隐藏檔)
cd (切換目錄)
cd是Change Directory的縮寫,這是用來變換工作目錄的指令。
文法:
測試:
# 切換到使用者目錄下
[[email protected] /]# cd home
# 使用 mkdir 指令建立 kuangstudy 目錄
[[email protected] home]# mkdir kuangstudy
# 進入 kuangstudy 目錄
[[email protected] home]# cd kuangstudy
# 回到上一級
[[email protected] kuangstudy]# cd ..
# 回到根目錄
[[email protected] kuangstudy]# cd /
# 表示回到自己的家目錄,亦即是 /root 這個目錄
[[email protected] kuangstudy]# cd ~
pwd ( 顯示目前所在的目錄 )
pwd 是 Print Working Directory 的縮寫,也就是顯示目前所在目錄的指令。
選項與參數:-P :顯示出确實的路徑,而非使用連接配接(link) 路徑。
測試:
# 單純顯示出目前的工作目錄
[[email protected] ~]# pwd
/root
# 如果是連結,要顯示真實位址,可以使用 -P參數
[[email protected] /]# cd bin
[[email protected] bin]# pwd -P
/usr/bin
mkdir (建立新目錄)
如果想要建立新的目錄的話,那麼就使用mkdir (make directory)吧。
mkdir [-mp] 目錄名稱
選項與參數:
- -m :配置檔案的權限喔!直接配置,不需要看預設權限 (umask) 的臉色~
- -p :幫助你直接将所需要的目錄(包含上一級目錄)遞歸建立起來!
測試:
# 進入我們使用者目錄下
[[email protected] /]# cd /home
# 建立一個 test 檔案夾
[[email protected] home]# mkdir test
# 建立多層級目錄
[[email protected] home]# mkdir test1/test2/test3/test4
mkdir: cannot create directory ‘test1/test2/test3/test4’:
No such file or directory # <== 沒辦法直接建立此目錄啊!
# 加了這個 -p 的選項,可以自行幫你建立多層目錄!
[[email protected] home]# mkdir -p test1/test2/test3/test4
# 建立權限為 rwx--x--x 的目錄。
[[email protected] home]# mkdir -m 711 test2
[[email protected] home]# ls -l
drwxr-xr-x 2 root root 4096 Mar 12 21:55 test
drwxr-xr-x 3 root root 4096 Mar 12 21:56 test1
drwx--x--x 2 root root 4096 Mar 12 21:58 test2
rmdir ( 删除空的目錄 )
文法:
rmdir [-p] 目錄名稱
選項與參數:-p :連同上一級『空的』目錄也一起删除
測試:
# 看看有多少目錄存在?
[[email protected] home]# ls -l
drwxr-xr-x 2 root root 4096 Mar 12 21:55 test
drwxr-xr-x 3 root root 4096 Mar 12 21:56 test1
drwx--x--x 2 root root 4096 Mar 12 21:58 test2
# 可直接删除掉,沒問題
[[email protected] home]# rmdir test
# 因為尚有内容,是以無法删除!
[[email protected] home]# rmdir test1
rmdir: failed to remove ‘test1’: Directory not empty
# 利用 -p 這個選項,立刻就可以将 test1/test2/test3/test4 依次删除。
[[email protected] home]# rmdir -p test1/test2/test3/test4
注意:這個 rmdir 僅能删除空的目錄,你可以使用 rm 指令來删除非空目錄,後面我們會将!
cp ( 複制檔案或目錄 )
文法:
[[email protected] ~]# cp [-adfilprsu] 來源檔(source) 目标檔(destination)
[[email protected] ~]# cp [options] source1 source2 source3 .... directory
選項與參數:
- -a:相當於 -pdr 的意思,至於 pdr 請參考下列說明;(常用)
- -p:連同檔案的屬性一起複制過去,而非使用預設屬性(備份常用);
- -d:若來源檔為連結檔的屬性(link file),則複制連結檔屬性而非檔案本身;
- -r:遞歸持續複制,用於目錄的複制行為;(常用)
- -f:為強制(force)的意思,若目标檔案已經存在且無法開啟,則移除後再嘗試一次;
- -i:若目标檔(destination)已經存在時,在覆寫時會先詢問動作的進行(常用)
- -l:進行硬式連結(hard link)的連結檔建立,而非複制檔案本身。
- -s:複制成為符号連結檔 (symbolic link),亦即『捷徑』檔案;
- -u:若 destination 比 source 舊才更新 destination !
測試:
# 找一個有檔案的目錄,我這裡找到 root目錄
[[email protected] home]# cd /root
[[email protected] ~]# ls
install.sh
[[email protected] ~]# cd /home
# 複制 root目錄下的install.sh 到 home目錄下
[[email protected] home]# cp /root/install.sh /home
[[email protected] home]# ls
install.sh
# 再次複制,加上-i參數,增加覆寫詢問?
[[email protected] home]# cp -i /root/install.sh /home
cp: overwrite ‘/home/install.sh’? y # n不覆寫,y為覆寫
rm ( 移除檔案或目錄 )
文法:
rm [-fir] 檔案或目錄
選項與參數:
- -f :就是 force 的意思,忽略不存在的檔案,不會出現警告資訊;
- -i :互動模式,在删除前會詢問使用者是否動作
- -r :遞歸删除啊!最常用在目錄的删除了!這是非常危險的選項!!!
測試:
# 将剛剛在 cp 的執行個體中建立的 install.sh删除掉!
[[email protected] home]# rm -i install.sh
rm: remove regular file ‘install.sh’? y
# 如果加上 -i 的選項就會主動詢問喔,避免你删除到錯誤的檔名!
# 盡量不要在伺服器上使用 rm -rf /
mv ( 移動檔案與目錄,或修改名稱 )
文法:
[[email protected] ~]# mv [-fiu] source destination
[[email protected] ~]# mv [options] source1 source2 source3 .... directory
選項與參數:
- -f :force 強制的意思,如果目标檔案已經存在,不會詢問而直接覆寫;
- -i :若目标檔案 (destination) 已經存在時,就會詢問是否覆寫!
- -u :若目标檔案已經存在,且 source 比較新,才會更新 (update)
測試:
# 複制一個檔案到目前目錄
[[email protected] home]# cp /root/install.sh /home
# 建立一個檔案夾 test
[[email protected] home]# mkdir test
# 将複制過來的檔案移動到我們建立的目錄,并檢視
[[email protected] home]# mv install.sh test
[[email protected] home]# ls
test
[[email protected] home]# cd test
[[email protected] test]# ls
install.sh
# 将檔案夾重命名,然後再次檢視!
[[email protected] test]# cd ..
[[email protected] home]# mv test mvtest
[[email protected] home]# ls
mvtest
基本屬性
看懂檔案屬性
Linux系統是一種典型的多使用者系統,不同的使用者處于不同的地位,擁有不同的權限。為了保護系統的安全性,Linux系統對不同的使用者通路同一檔案(包括目錄檔案)的權限做了不同的規定。
在Linux中我們可以使用或者ls –l指令來顯示一個檔案的屬性以及檔案所屬的使用者群組,如:
執行個體中,boot檔案的第一個屬性用"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"字元表示,則有執行權限,如果用"-"字元表示,則沒有執行權限。
對于檔案來說,它都有一個特定的所有者,也就是對該檔案具有所有權的使用者。
同時,在Linux系統中,使用者是按組分類的,一個使用者屬于一個或多個組。
檔案所有者以外的使用者又可以分為檔案所有者的同組使用者和其他使用者。
是以,Linux系統按檔案所有者、檔案所有者同組使用者和其他使用者來規定了不同的檔案通路權限。
在以上執行個體中,boot 檔案是一個目錄檔案,屬主和屬組都為 root。
修改檔案屬性
1、chgrp:更改檔案屬組
chgrp [-R] 屬組名 檔案名
-R:遞歸更改檔案屬組,就是在更改某個目錄檔案的屬組時,如果加上-R的參數,那麼該目錄下的所有檔案的屬組都會更改。
2、chown:更改檔案屬主,也可以同時更改檔案屬組
chown [–R] 屬主名 檔案名
chown [-R] 屬主名:屬組名 檔案名
3、chmod:更改檔案9個屬性
chmod [-R] xyz 檔案或目錄
Linux檔案屬性有兩種設定方法,一種是數字,一種是符号。
Linux檔案的基本權限就有九個,分别是owner/group/others三種身份各有自己的read/write/execute權限。
先複習一下剛剛上面提到的資料:檔案的權限字元為:『-rwxrwxrwx』, 這九個權限是三個三個一組的!其中,我們可以使用數字來代表各個權限,各權限的分數對照表如下:
r:4 w:2 x:1
每種身份(owner/group/others)各自的三個權限(r/w/x)分數是需要累加的,例如當權限為:[-rwxrwx—] 分數則是:
- owner = rwx = 4+2+1 = 7
- group = rwx = 4+2+1 = 7
- others= — = 0+0+0 = 0
chmod 770 filename
可以自己下去多進行測試!
檔案内容檢視
概述
Linux系統中使用以下指令來檢視檔案的内容:
- cat 由第一行開始顯示檔案内容
- tac 從最後一行開始顯示,可以看出 tac 是 cat 的倒着寫!
- nl 顯示的時候,順道輸出行号!
- more 一頁一頁的顯示檔案内容
- less 與 more 類似,但是比 more 更好的是,他可以往前翻頁!
- head 隻看頭幾行
- tail 隻看尾巴幾行
你可以使用 man [指令]來檢視各個指令的使用文檔,如 :man cp。
cat 由第一行開始顯示檔案内容
文法:
選項與參數:
- -A :相當於 -vET 的整合選項,可列出一些特殊字元而不是空白而已;
- -b :列出行号,僅針對非空白行做行号顯示,空白行不标行号!
- -E :将結尾的斷行位元組 $ 顯示出來;
- -n :列印出行号,連同空白行也會有行号,與 -b 的選項不同;
- -T :将 [tab] 按鍵以 ^I 顯示出來;
- -v :列出一些看不出來的特殊字元
測試:
# 檢視網絡配置: 檔案位址 /etc/sysconfig/network-scripts/
[[email protected] ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
tac
tac與cat指令剛好相反,檔案内容從最後一行開始顯示,可以看出 tac 是 cat 的倒着寫!如:
[[email protected] ~]# tac /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
BOOTPROTO=dhcp
DEVICE=eth0
nl 顯示行号
文法:
nl [-bnw] 檔案
選項與參數:
- -b :指定行号指定的方式,主要有兩種:-b a :表示不論是否為空行,也同樣列出行号(類似 cat -n);-b t :如果有空行,空的那一行不要列出行号(預設值);
- -n :列出行号表示的方法,主要有三種:-n ln :行号在熒幕的最左方顯示;-n rn :行号在自己欄位的最右方顯示,且不加 0 ;-n rz :行号在自己欄位的最右方顯示,且加 0 ;
- -w :行号欄位的占用的位數。
測試:
[[email protected] ~]# nl /etc/sysconfig/network-scripts/ifcfg-eth0
1DEVICE=eth0
2BOOTPROTO=dhcp
3ONBOOT=yes
more 一頁一頁翻動
在 more 這個程式的運作過程中,你有幾個按鍵可以按的:
- 空白鍵 (space):代表向下翻一頁;
- Enter :代表向下翻『一行』;
- /字串 :代表在這個顯示的内容當中,向下搜尋『字串』這個關鍵字;
- :f :立刻顯示出檔名以及目前顯示的行數;
- q :代表立刻離開 more ,不再顯示該檔案内容。
- b 或 [ctrl]-b :代表往回翻頁,不過這動作隻對檔案有用,對管線無用。
[[email protected] etc]# more /etc/csh.login
....(中間省略)....
--More--(28%) # 重點在這一行喔!你的光标也會在這裡等待你的指令
less 一頁一頁翻動,以下執行個體輸出/etc/man.config檔案的内容:
less運作時可以輸入的指令有:
- 空白鍵 :向下翻動一頁;
- [pagedown]:向下翻動一頁;
- [pageup] :向上翻動一頁;
- /字串 :向下搜尋『字串』的功能;
- ?字串 :向上搜尋『字串』的功能;
- n :重複前一個搜尋 (與 / 或 ? 有關!)
- N :反向的重複前一個搜尋 (與 / 或 ? 有關!)
- q :離開 less 這個程式;
[[email protected] etc]# more /etc/csh.login
....(中間省略)....
: # 這裡可以等待你輸入指令!
head 取出檔案前面幾行
文法:
head [-n number] 檔案
選項與參數:
- -n 後面接數字,代表顯示幾行的意思!
預設的情況中,顯示前面 10 行!若要顯示前 20 行,就得要這樣:
tail 取出檔案後面幾行
文法:
tail [-n number] 檔案
選項與參數:
- -n :後面接數字,代表顯示幾行的意思
預設的情況中,顯示最後 10 行!若要顯示最後 20 行,就得要這樣:
拓展:Linux 連結概念
Linux 連結分兩種,一種被稱為硬連結(Hard Link),另一種被稱為符号連結(Symbolic Link)。
情況下,ln 指令産生硬連結。
硬連接配接
硬連接配接指通過索引節點來進行連接配接。在 Linux 的檔案系統中,儲存在磁盤分區中的檔案不管是什麼類型都給它配置設定一個編号,稱為索引節點号(Inode Index)。在 Linux 中,多個檔案名指向同一索引節點是存在的。比如:A 是 B 的硬連結(A 和 B 都是檔案名),則 A 的目錄項中的 inode 節點号與 B 的目錄項中的 inode 節點号相同,即一個 inode 節點對應兩個不同的檔案名,兩個檔案名指向同一個檔案,A 和 B 對檔案系統來說是完全平等的。删除其中任何一個都不會影響另外一個的通路。
硬連接配接的作用是允許一個檔案擁有多個有效路徑名,這樣使用者就可以建立硬連接配接到重要檔案,以防止“誤删”的功能。其原因如上所述,因為對應該目錄的索引節點有一個以上的連接配接。隻删除一個連接配接并不影響索引節點本身和其它的連接配接,隻有當最後一個連接配接被删除後,檔案的資料塊及目錄的連接配接才會被釋放。也就是說,檔案真正删除的條件是與之相關的所有硬連接配接檔案均被删除。
軟連接配接
另外一種連接配接稱之為符号連接配接(Symbolic Link),也叫軟連接配接。軟連結檔案有類似于 Windows 的快捷方式。它實際上是一個特殊的檔案。在符号連接配接中,檔案實際上是一個文本檔案,其中包含的有另一檔案的位置資訊。比如:A 是 B 的軟連結(A 和 B 都是檔案名),A 的目錄項中的 inode 節點号與 B 的目錄項中的 inode 節點号不相同,A 和 B 指向的是兩個不同的 inode,繼而指向兩塊不同的資料塊。但是 A 的資料塊中存放的隻是 B 的路徑名(可以根據這個找到 B 的目錄項)。A 和 B 之間是“主從”關系,如果 B 被删除了,A 仍然存在(因為兩個是不同的檔案),但指向的是一個無效的連結。
測試:
[[email protected] /]# cd /home
[[email protected] home]# touch f1 # 建立一個測試檔案f1
[[email protected] home]# ls
f1
[[email protected] home]# ln f1 f2 # 建立f1的一個硬連接配接檔案f2
[[email protected] home]# ln -s f1 f3 # 建立f1的一個符号連接配接檔案f3
[[email protected] home]# ls -li # -i參數顯示檔案的inode節點資訊
397247 -rw-r--r-- 2 root root 0 Mar 13 00:50 f1
397247 -rw-r--r-- 2 root root 0 Mar 13 00:50 f2
397248 lrwxrwxrwx 1 root root 2 Mar 13 00:50 f3 -> f1
從上面的結果中可以看出,硬連接配接檔案 f2 與原檔案 f1 的 inode 節點相同,均為 397247,然而符号連接配接檔案的 inode 節點不同。
# echo 字元串輸出 >> f1 輸出到 f1檔案
[[email protected] home]# echo "I am f1 file" >>f1
[[email protected] home]# cat f1
I am f1 file
[[email protected] home]# cat f2
I am f1 file
[[email protected] home]# cat f3
I am f1 file
[[email protected] home]# rm -f f1
[[email protected] home]# cat f2
I am f1 file
[[email protected] home]# cat f3
cat: f3: No such file or directory
通過上面的測試可以看出:當删除原始檔案 f1 後,硬連接配接 f2 不受影響,但是符号連接配接 f1 檔案無效;
依此您可以做一些相關的測試,可以得到以下全部結論:
- 删除符号連接配接f3,對f1,f2無影響;
- 删除硬連接配接f2,對f1,f3也無影響;
- 删除原檔案f1,對硬連接配接f2沒有影響,導緻符号連接配接f3失效;
- 同時删除原檔案f1,硬連接配接f2,整個檔案會真正的被删除。