從這一章開始,阿銘介紹的命令會越來越多,希望你能夠反復練習每一個命令的每一個選項。在Windows下,新建、復制、刪除文件或者文件夾都非常簡單,而Linux需要我們使用命令行進行操作。這樣便增加了學習Linux系統的難度,不過不用擔心,一旦能夠熟練使用它們,那么你將永遠也不會忘記。萬事開頭難,所以請大家努力吧!
5.1絕對路徑和相對路徑
在Linux中,什么是一個文件的路徑呢?簡單地說,就是這個文件存放的地方,例如在上一章提到的/root/.ssh/authorized_keys就是一個文件的路徑。只要你告訴系統某個文件的路徑,系統就可以找到這個文件。
在Linux中,存在著絕對路徑和相對路徑。
絕對路徑:路徑的寫法一定是由根目錄/寫起的,例如/usr/local/mysql。
相對路徑:路徑的寫法不是由根目錄/寫起的。例如,首先用戶進入到/home,然后再進入到test ,執行的命令為
# cd /home # cd test
此時用戶所在的路徑為/home/test。第一個cd命令后緊跟/home,前面有斜杠;而第二個cd命令后緊跟test,前面沒有斜杠。這個test是相對于/home目錄來講的,所以稱為相對路徑。
5.1.1命令cd
命令cd(changedirectory的簡寫)是用來變更用戶所在目錄的,如果后面什么都不跟,就會直接進入當前用戶的根目錄下。我們做實驗用的是root賬戶,所以運行命令cd后,會進入root賬戶的根目錄/root下。如果后面跟目錄名,則會直接切換到指定目錄下。示例命令如下:
# cd /tmp/ # pwd /tmp # cd # pwd /root
上例中,命令pwd用于顯示當前所在目錄。命令cd后面只能是目錄名,如果跟了文件名,則會報錯,例如:
# cd /etc/passwd -bash: cd: /etc/passwd: 不是目錄
因為/etc/passwd為一個文件,所以就報錯了。在Linux文件系統中,有兩個特殊的符號也可以表示目錄。“.”表示當前目錄,“..”表示當前目錄的上一級目錄,示例命令如下:
# cd /usr/local/lib/ # pwd /usr/local/lib # cd . # pwd /usr/local/lib # cd .. # pwd /usr/local
上例中,首先進入/usr/local/lib/目錄,接著輸入.,用命令pwd查看當前目錄,還是在/usr/local/lib/目錄下,然后輸入..,則進入/usr/local/ 目錄(即/usr/local/lib目錄的上一級目錄)。
5.1.2命令mkdir
命令mkdir(makedirectory的簡寫)用于創建目錄,這個命令在上一章中用過。該命令的格式為:mkdir [-mp] [目錄名稱]。其中,-m、-p為其選項。-m選項用于指定要創建目錄的權限(這個選項不常用,阿銘不作重點解釋)。-p選項很管用,我們先來做個試驗,你就一目了然了。執行如下命令:
# mkdir /tmp/test/123
mkdir: 無法創建目錄 '/tmp/test/123': 沒有那個文件或目錄
# mkdir -p /tmp/test/123 # ls /tmp/test 123
當我們想創建目錄/tmp/test/123時,提示無法創建、/tmp/test目錄不存在。在Linux中,如果它發現要創建的目錄的上一級目錄不存在,就會報錯。為了解決這個問題,Linux設置了-p選項,這個選項可以幫我們創建一大串級聯目錄,并且當創建一個已經存在的目錄時,不會報錯。示例命令如下:
# ls -ld /tmp/test/123 drwxr-xr-x 2 root 6 12月 30 07:25 /tmp/test/123 # mkdir /tmp/test/123 mkdir: 無法創建目錄 '/tmp/test/123': 文件已存在 # mkdir -p /tmp/test/123 # ls -ld /tmp/test/123 drwxr-xr-x 2 root 6 12月 30 07:25 /tmp/test/123
在上一章中阿銘已經介紹過ls命令,但并沒有介紹它的-d選項。這個選項是針對目錄的,通常都是和-l并用,寫成-ld。它可以查看指定目錄的屬性,比如在本例中,它可以查看/tmp/test/123目錄的創建時間,如果不加-d,則會顯示該目錄里面的文件和子目錄的屬性。
5.1.3命令rmdir
命令rmdir(removedirectory的簡寫)用于刪除空目錄,后面可以是一個目錄,也可以是多個目錄(用空格分隔)。該命令只能刪除目錄,不能刪除文件,所以阿銘一般不用它,而改用命令rm(remove的簡寫),這個命令既可以刪除目錄,又可以刪除文件,將在下一節中介紹。rmdir有和mkdir具有相同的選項-p,它同樣可以級聯刪除一大串目錄,但在級聯的目錄中,如果某一個目錄里還有目錄或者文件時,這個命令就不好用了。我們先來看看命令rmdir的用法,示例命令如下:
# ls /tmp/test 123 # rmdir /tmp/test/ rmdir: 刪除 '/tmp/test/' 失敗: 目錄非空 # rmdir /tmp/test/123 # ls /tmp/test #
在上例中,命令rmdir只能刪除空目錄,即使加上-p選項也只能刪除一串空目錄。可見,這個命令有很大的局限性,偶爾用一下還可以。
5.1.4命令rm
命令rm是最常用的,它也有很多選項。你可以通過命令man rm來獲得它的詳細幫助信息。這里,阿銘只介紹最常用的兩個選項。
-r:刪除目錄用的選項,類似于rmdir,但可以刪除非空目錄。下面阿銘先創建一連串的目錄,然后嘗試刪除它們。示例命令如下:
# mkdir -p /tmp/test/123 # rm -r /tmp/test/123 rm:是否刪除目錄 '/tmp/test/123'? y
和rmdir不同的是,使用rm –r命令刪除目錄時,會詢問是否刪除,如果輸入“y”則會刪除,如果輸入“n”則不刪除。另外,rm -r命令能刪除非空目錄。
-f:表示強制刪除。它不再詢問是否刪除,而是直接刪除。如果后面跟一個不存在的文件或者目錄,則不會報錯。下面阿銘嘗試刪除一個不存在的目錄,示例命令如下:
# rm /tmp/test/123/123 rm: 無法刪除 '/tmp/test/123/123': 沒有那個文件或目錄 # rm -f /tmp/test/123/123
上例中,/tmp/test/123/123這個目錄是不存在的,但加上-f選項后,就不會報錯。但如果要刪除一個存在的目錄時,即使加上-f選項也會報錯。所以,使用命令rm刪除目錄時,一定要加-r選項。請對比下面的示例命令和上面的示例命令的區別:
# rm -f /tmp/test/123 rm: 無法刪除 '/tmp/test/123': 是一個目錄 # rm -rf /tmp/test/123
關于rm命令,阿銘使用最多的是-rf選項,這樣刪除文件或目錄比較方便。但請大家千萬要注意,rm -rf命令后面不能加“/”,否則它會把你的系統文件全部刪除,這是非常危險的!
5.2環境變量PATH
在講環境變量之前,阿銘先介紹一下命令which,它用于查找某個命令的絕對路徑。示例命令如下:
# which rmdir /usr/bin/rmdir # which rm alias rm='rm -i' /usr/bin/rm # which ls alias ls='ls --color=auto' /usr/bin/ls
其中rm和ls是兩個特殊的命令,在上例中我們使用alias命令做了別名。我們用的rm實際上是rm -i,加上-i選項后,刪除文件或者命令時都會詢問是否確定要刪除,這樣做比較安全。命令alias可以設置命令或文件的別名,阿銘會在10.1.3節中詳細介紹。命令which阿銘不常使用,平時只用來查詢某個命令的絕對路徑。
在上面的示例中,用which查到rm命令的絕對路徑為/usr/bin/rm。那么你是否會問:“為什么我們使用命令時,只是直接打出了命令,而沒有使用這些命令的絕對路徑呢?”這是環境變量PATH在起作用。請輸入如下命令:
# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
這里的echo用來輸出$PATH的值。PATH前面的$是變量的前綴符號,這些知識點將會在第10章中詳細介紹。
因為/bin目錄在PATH的設定中,所以自然可以找到ls。但值得注意的是,由于PATH里沒有/root目錄,如果你將ls移到/root目錄下,當執行ls命令時,系統自然就找不到可執行文件了,它會提示command not found!。示例命令如下:
# mv /usr/bin/ls /root/ # ls -bash: /usr/bin/ls: 沒有那個文件或目錄
命令mv(move的簡寫)用于移動目錄或者文件,它還有重命名的作用(這個將在4.2.2節中介紹)。那么,該如何解決上面的這種問題呢?有兩種方法,一種方法是直接將/root這個路徑加入到$PATH當中,命令如下:
# PATH=$PATH:/root # echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root # ls anaconda-ks.cfg ls
另一種方法是使用絕對路徑,命令如下:
# /root/ls anaconda-ks.cfg ls
為了不影響系統使用,建議將ls文件還原,命令如下:
# mv /root/ls /usr/bin/
5.2.1命令cp
cp是copy(即復制)的簡寫,該命令的格式為:cp [選項] [ 來源文件 ] [目的文件]。例如,我想把test1復制成test2,可以寫為cp test1 test2。下面介紹命令cp的幾個常用選項。
-r:如果要復制一個目錄,必須加-r選項,否則不能復制,這類似于rm命令。示例命令如下:
# mkdir 123 # cp 123 456 cp: 略過目錄"123" # cp -r 123 456 # ls –ld 123 456 drwxr-xr-x 2 root 6 12月 30 07:35 123 drwxr-xr-x 2 root 6 12月 30 07:36 456
-i:這是安全選項,如果遇到一個已存在的文件,會詢問是否覆蓋,這也與rm命令類似。在RedHat/Rocky系統中,使用的cp命令其實是cp –i,我們可以通過which命令查看,具體如下:
# which cp alias cp='cp -i' /bin/cp
為了更形象地說明-i 選項的作用,我們來做一個簡單的小試驗,命令如下:
# cd 123 # ls # touch 111 # touch 222 # cp -i 111 222 cp:是否覆蓋 '222'?n # echo 'abc' > 111 # echo 'def' > 2 22 # cat 111 222 abc def # /bin/cp 111 222 # cat 111 abc # cat 222 abc
上例中,touch可以解釋為:如果有這個文件,則會改變該文件的訪問時間;如果沒有這個文件,就會創建這個文件。前面說過,echo命令用于打印,這里echo的內容abc和def并沒有顯示在屏幕上,而是分別寫入了文件“111”和“222”。起寫入作用的就是符號“>”,這在Linux中叫做重定向,即把前面產生的輸出寫入到后面的文件中。而cat命令則用于讀一個文件,并把讀出的內容打印到當前屏幕上。(重定向將在第11章中介紹,cat命令將在5.3.1節中詳細介紹,這里你只要明白它們的含義即可。)
5.2.2命令mv
mv是move的簡寫,該命令的格式為:mv [ 選項 ] [源文件或目錄] [目標文件或目錄]。該命令有如下幾種情況。
目標文件是目錄,但該目錄不存在。
目標文件是目錄,且該目錄存在。
目標文件是文件,且該文件不存在。
目標文件是文件,但該文件存在。
當目標文件是目錄時,其存在與否,執行后的結果是不一樣的。如果該目錄存在,則會把源文件或目錄移動到該目錄中。如果該目錄不存在,則會把源目錄重命名為給定的目標文件名。
當目標文件是文件時,其存在與否,執行后的結果也是不一樣的。如果該文件存在,則會詢問是否覆蓋。如果該文件不存在,則會把源文件重命名為給定的目標文件名。
下面我們來做幾個小試驗,示例命令如下:
# mkdir /tmp/test_mv # cd /tmp/test_mv # mkdir dira dirb # ls dira dirb # mv dira dirc # ls dirb dirc
上例中,首先阿銘創建了一個實驗用的目錄/tmp/test_mv,然后進入到該目錄下進行實驗,這樣做的目的是保持目錄和文件簡潔,后面的實驗以此類推。這里,目標文件是目錄dirc,并且dirc不存在,相當于把目錄dira重命名為dirc。
下例中,目標文件是目錄dirb,且dirb存在,則會把目錄dirc移動到目錄dirb里:
# mv dirc dirb # ls dirb # ls dirb dirc
下例中,mv filed filee的目標文件是文件filee且這個文件不存在,相當于把文件filed重命名為filee。mv filee dirb命令則將更名后的文件filee移動到目錄dirb里。
# touch filed # ls dirb filed # mv filed filee # ls dirb filee # mv filee dirb # ls dirb # ls dirb dirc filee
5.3幾個與文檔相關的命令
上面介紹的幾個命令幾乎都是與目錄相關的,下面阿銘繼續介紹幾個與文檔相關的命令。
5.3.1命令cat
命令cat(它并不是某個單詞的簡寫,大家可以通過man cat命令查看它的解釋)是比較常用的一個命令,用于查看一個文件的內容并將其顯示在屏幕上。cat后面可以不加任何選項,直接跟文件名。下面阿銘介紹它的兩個常用選項。
-n :查看文件時,把行號也顯示到屏幕上。示例命令如下(當前目錄依然在/tmp/test_mv):
# echo '111111111' > dirb/filee # echo '222222222' >> dirb/filee # cat dirb/filee 111111111 222222222 # cat -n dirb/filee 1 111111111 2 222222222
上例中出現了符號>>,它跟前面介紹的符號>類似,其作用也是重定向,即把前面的內容輸入到后面的文件中,但符號>>是“追加”的意思。當使用符號>時,如果文件中有內容,則會刪除文件中原有的內容,而使用符號>>則不會刪除原有的內容。
-A:顯示所有的內容,包括特殊字符。示例命令如下:
# cat -A dirb/filee 111111111$ 222222222$
上例中,若不加-A選項,那么每行后面的$符號是看不到的。
5.3.2命令tac
和命令cat一樣,命令 tac(正好是命令cat的反序寫法)也是把文件的內容顯示在屏幕上,只不過是先顯示最后一行,然后顯示倒數第二行,最后才顯示第一行。我們使用命令tac來查看剛才創建的文件dirb/filee,顯示的結果和命令cat正好是反序,如下所示:
# tac dirb/filee 222222222 111111111
5.3.3命令more
命令more也用于查看一個文件的內容,后面直接跟文件名。當文件內容太多,一屏不能全部顯示時,用命令cat肯定是看不了前面的內容,這時可以使用命令more。當看完一屏后,按空格鍵可以繼續看下一屏,看完所有內容后就會退出,按Ctrl+B可以向上翻屏,按Ctrl+F向下翻屏(同空格)。如果你想提前退出,按q鍵即可。
5.3.4命令less
命令less的作用和命令more一樣,后面直接跟文件名,但命令less比more功能要多一些。按空格鍵可以翻頁,按j鍵可以向下移動(按一下就向下移動一行),按k鍵可以向上移動。在使用more和less查看某個文件時,你可以按一下/鍵,并輸入一個字符串(如root),然后回車,這樣就可以查找這個字符串了。如果是查找多個該字符串,可以按n鍵顯示下一個。另外,也可以用?鍵替代/鍵來搜索字符串,唯一不同的是,/是在當前行向下搜索,而?是在當前行向上搜索。
5.3.5命令head
命令head用于顯示文件的前10行,后面直接跟文件名。如果加-n選項,則顯示文件的前幾行,示例命令如下:
# head /etc/passwd root0root:/root:/bin/bash bin1bin:/bin:/sbin/nologin daemon2daemon:/sbin:/sbin/nologin adm3adm:/var/adm:/sbin/nologin lp4lp:/var/spool/lpd:/sbin/nologin sync5sync:/sbin:/bin/sync shutdown6shutdown:/sbin:/sbin/shutdown halt7halt:/sbin:/sbin/halt mail8mail:/var/spool/mail:/sbin/nologin operator11operator:/root:/sbin/nologin # head -n 1 /etc/passwd root0root:/root:/bin/bash # head -n2 /etc/passwd root0root:/root:/bin/bash bin1bin:/bin:/sbin/nologin
大家請注意,選項-n后有無空格均可。另外,也可以省略字母n,-后面直接跟數字, 如下:
# head -2 /etc/passwd root0root:/root:/bin/bash bin1bin:/bin:/sbin/nologin
5.3.6命令tail
和命令head類似,命令tail用于顯示文件的最后10行,后面直接跟文件名。如果加-n選項,則顯示文件的最后幾行,示例命令如下:
# tail /etc/passwd nobody65534Kernel Overflow User:/:/sbin/nologin dbus81System message bus:/:/sbin/nologin systemd-coredump999systemd Core Dumper:/:/sbin/nologin systemd-resolve193systemd Resolver:/:/sbin/nologin tss59Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin polkitd998User for polkitd:/:/sbin/nologin unbound997Unbound DNS resolver:/etc/unbound:/sbin/nologin sssd996User for sssd:/:/sbin/nologin sshd74Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony995:/var/lib/chrony:/sbin/nologin # tail -n2 /etc/passwd sshd74Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony995:/var/lib/chrony:/sbin/nologin # tail -2 /etc/passwd sshd74Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony995:/var/lib/chrony:/sbin/nologin
同樣,-n后面有無空格均可,且字母n也可以省略。
另外,命令tail的-f選項也常用,它可以動態顯示文件的最后10行。如果文件內容在不斷增加,使用-f選項非常方便和直觀。比如tail -f /var/log/messages可以動態、實時地查看文件/var/log/ messages中的內容。
5.4文件的所有者和所屬組
一個Linux目錄或者文件,都會有一個所有者和所屬組。所有者是指文件的擁有者,而所屬組指的是這個文件屬于哪一個用戶組(關于用戶、用戶組的概念,會在第5章中詳細介紹,這里你要明白一個用戶組下面會有若干個用戶)。Linux這樣設置文件屬性的目的是為了文件的安全。
例如,test文件的所有者是user0,而test1文件的所有者是user1,那么user1很有可能是不能查看test文件的,相應地,user0也很有可能不能查看test1文件(之所以說是可能,是因為user0和user1有可能屬于同一個用戶組,而恰好這個用戶組對這兩個文件有查看權限)。
有時我們也會有這樣的需求:使一個文件能同時被user0和user1查看,這怎么實現呢?這時“所屬組”就派上用場了。先創建一個組users,讓user0和user1同屬于users組,然后建立一個文件test2,且其所屬組為users,這樣user0和user1都可以訪問test2文件。Linux文件屬性不僅規定了所有者和所屬組,還規定了所有者(user)、所屬組(group)以及其他用戶(others)對該文件的權限。我們可以通過ls -l命令來查看這些屬性,代碼如下:
# ls -l /etc/passwd -rw-r--r--. 1 root 1080 12月 26 08:08 /etc/passwd
其中,第3列和第4列的root就是所有者和所屬組。
5.5Linux文件屬性
在上例中,用ls –l命令查看當前目錄下的文件時,共顯示了9列內容(用空格劃分列),它們都代表什么含義呢?
第1列:包含該文件的類型、所有者、所屬組以及其他用戶對該文件的權限。第1列共11位(阿銘這里列出的是10位,沒有最后一位,你可以通過ls -l /看一下,會看到最后一位是一個.),其中第1位用來描述該文件的類型。上例中我們看到的文件類型有d和-,其實除了這兩種外,還有l、b、c、s等,具體描述如下所示。
d表示該文件為目錄。
-表示該文件為普通文件。
l表示該文件為鏈接文件(link file),4.9.3節中提到的軟鏈接即為該類型,示例命令如下:
# ls -l /etc/rc.local lrwxrwxrwx. 1 root 13 7月 1 11:29 /etc/rc.local -> rc.d/rc.local
上例中,第1列第1位是l,表示該文件為鏈接文件,后面阿銘還會介紹它。
b表示該文件為塊設備,比如/dev/sda就是這樣的文件,磁盤分區文件就是這種類型。
c表示該文件為串行端口設備文件(又稱字符設備文件),比如鍵盤、鼠標、打印機、tty終端等都是這樣的文件。
s表示該文件為套接字文件(socket),用于進程之間的通信,后面講到MySQL時會用到該類型的文件。
文件類型后面的9位,每3位為一組,上例中(rc.local)均為rwx這3個參數的組合。其中,r代表可讀,w代表可寫,x代表可執行。前3位為所有者(user)的權限,中間3位為所屬組(group)的權限,最后3位為其他非本群組用戶(others)的權限。下面阿銘舉例來說明一下。
假設一個文件的屬性為-rwxr-xr--,它代表的意思是,該文件為普通文件,文件擁有者可讀、可寫且可執行,文件所屬組對其可讀、不可寫但可執行,其他用戶對其只可讀。對于一個目錄來講,打開這個目錄即為執行這個目錄,所以任何一個目錄必須要有x權限才能打開并查看該目錄下的內容。例如,一個目錄的屬性為drwxr--r--,其所有者為root,那么除root之外的其他用戶是不能打開這個目錄的。
關于前面提到第1列最后1位的“.”,阿銘要特別說明一下。老版本CentOS 5 是沒有這個點的,這主要是因為新版本的ls添加了Selinux或者acl的屬性。如果文件或者目錄使用了Selinux context的屬性,這里會是一個點“.”;如果設置了acl的屬性,這里會是一個加號“+”。
-
Linux
+關注
關注
87文章
11232瀏覽量
208952 -
WINDOWS
+關注
關注
3文章
3526瀏覽量
88449 -
文件
+關注
關注
1文章
561瀏覽量
24703
原文標題:第5章 Linux文件和目錄管理上
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論