tft每日頭條

 > 科技

 > linux目錄基礎知識

linux目錄基礎知識

科技 更新时间:2025-02-08 15:55:30

linux目錄基礎知識?提醒:本文為合集文章,後續會持續更新,現在小編就來說說關于linux目錄基礎知識?下面内容希望能幫助到你,我們來一起看看吧!

linux目錄基礎知識(Linux文件和目錄管理)1

linux目錄基礎知識

提醒:本文為合集文章,後續會持續更新!

關注我,每日提升!

從這一章開始,阿銘介紹的命令會越來越多,希望你能夠反複練習每一個命令的每一個選項。在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(change directory的簡寫)是用來變更用戶所在目錄的,如果後面什麼都不跟,就會直接進入當前用戶的根目錄下。我們做實驗用的是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(make directory的簡寫)用于創建目錄,這個命令在上一章中用過。該命令的格式為: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(remove directory的簡寫)用于删除空目錄,後面可以是一個目錄,也可以是多個目錄(用空格分隔)。該命令隻能删除目錄,不能删除文件,所以阿銘一般不用它,而改用命令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 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin # head -n 1 /etc/passwd root:x:0:0:root:/root:/bin/bash # head -n2 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin

大家請注意,選項-n後有無空格均可。另外,也可以省略字母n,-後面直接跟數字, 如下:

# head -2 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin

5.3.6 命令tail

和命令head類似,命令tail用于顯示文件的最後10行,後面直接跟文件名。如果加-n選項,則顯示文件的最後幾行,示例命令如下:

# tail /etc/passwd nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin sssd:x:996:993:User for sssd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:995:992::/var/lib/chrony:/sbin/nologin # tail -n2 /etc/passwd sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:995:992::/var/lib/chrony:/sbin/nologin # tail -2 /etc/passwd sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:995:992::/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.5 Linux文件屬性

在上例中,用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的屬性,這裡會是一個加号“ ”。關于Selinux和acl,阿銘不再詳細介紹,你隻要了解是怎麼回事即可。

第2列:表示該文件占用的節點(inode),如果是目錄,那這個數值與該目錄下的子目錄數量有關。

第3列:表示該文件的所有者。

第4列:表示該文件的所屬組。

第5列:表示該文件的大小。

第6列、第7列和第8列:表示該文件最後一次被修改的時間(mtime),依次為月份、日期以及時間。

第9列:表示文件名。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved