linux目錄基礎知識?提醒:本文為合集文章,後續會持續更新,現在小編就來說說關于linux目錄基礎知識?下面内容希望能幫助到你,我們來一起看看吧!
提醒:本文為合集文章,後續會持續更新!
關注我,每日提升!
從這一章開始,阿銘介紹的命令會越來越多,希望你能夠反複練習每一個命令的每一個選項。在Windows下,新建、複制、删除文件或者文件夾都非常簡單,而Linux需要我們使用命令行進行操作。這樣便增加了學習Linux系統的難度,不過不用擔心,一旦能夠熟練使用它們,那麼你将永遠也不會忘記。萬事開頭難,所以請大家努力吧!
5.1 絕對路徑和相對路徑
在Linux中,什麼是一個文件的路徑呢?簡單地說,就是這個文件存放的地方,例如在上一章提到的/root/.ssh/authorized_keys就是一個文件的路徑。隻要你告訴系統某個文件的路徑,系統就可以找到這個文件。
在Linux中,存在着絕對路徑和相對路徑。
# 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等,具體描述如下所示。
# ls -l /etc/rc.local
lrwxrwxrwx. 1 root 13 7月 1 11:29 /etc/rc.local -> rc.d/rc.local
上例中,第1列第1位是l,表示該文件為鍊接文件,後面阿銘還會介紹它。
文件類型後面的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每日頭條,我们将持续为您更新最新资讯!