Linux 文件與目錄管理

2018-08-12 21:29 更新

Linux 文件與目錄管理

linux 中什么是一個文件的路徑呢,說白了就是這個文件存在的地方,例如在上一章提到的/root/.ssh/authorized_keys 這就是一個文件的路徑如果你告訴系統(tǒng)這個文件的路徑,那么系統(tǒng)就可以找到這個文件。 linux 的世界中,存在著絕對路徑和相對路徑。

絕對路徑:路徑的寫法一定由根目錄”/”寫起,例如/usr/local/mysql 這就是絕對路徑

相對路徑:路徑的寫法不是由根目錄”/”寫起,例如,首先用戶進入到/ 然后再進入到 home ,命令為 cd /home 然后 cd test 此時用戶所在的路徑為 /home/test 。第一個cd命令后跟 /home 第二個 cd 命令后跟 test ,并沒有斜杠,這個test是相對于/home 目錄來講的,所以叫做相對路徑。

pwd這個命令打印出當前所在目錄

6_1.png.jpg

cd 進入到某一個目錄

6_12.png.jpg

./ 指的是當前目錄

../ 指的是當前目錄的上一級目錄

6_13.png.jpg

上圖中,首先進入到/usr/local/lib/ 目錄下,然后再進入 ./ 其實還是進入到當前目錄下,用pwd查看當前目錄,并沒有發(fā)生變化,然后再進入../ 則是進入到了/usr/local/目錄下,即/usr/local/lib目錄的上一級目錄。你看明白了嗎?

mkdir創(chuàng)建一個目錄,這個命令在上一章節(jié)中提及過。mkdir 其實就是make directory的縮寫。其語法為 mkdir [-mp] [目錄名稱] ,其中-m , –p 為其選項,-m:這個參數(shù)用來指定要創(chuàng)建目錄的權(quán)限,該參數(shù)不常用,所以筆者不做重點解釋。-p:這個參數(shù)很管用的,先來做個試驗,你會一目了然的

6_14.png.jpg

當我們想創(chuàng)建 /tmp/test/123 目錄,可是提示不能創(chuàng)建,原因是/tmp/test目錄不存在,你會說,這個linux怎么這樣傻,/tmp/test目錄不存在就自動創(chuàng)建不就OK了嘛,的確linux確實很傻,如果它發(fā)現(xiàn)要創(chuàng)建的目錄的上一級目錄不存在就會報錯。然后linux也為我們想好了解決辦法,即-p參數(shù)

6_15.png.jpg

你看到這里,是不是明白-p參數(shù)的作用了?沒錯,它的作用就是遞歸創(chuàng)建目錄,即使上級目錄不存在。還有一種情況就是如果你想要創(chuàng)建的目錄存在的話,會提示報錯,然后你加上-p參數(shù)后,就不會報錯了

6_16.png.jpg

rmdir刪除一個目錄。

6_17.png.jpg

rmdir 其實是rmove directory 縮寫,其只有一個選項-p 類似與mkdir命令,這個參數(shù)的作用是將上級目錄一起刪除。舉個例子吧,新建目錄mkdir -p d1/d2/d3 ,rmdir -p d1/d2/d3相當于是刪除了d1,d1/d2, d1/d2/d3。如果一個目錄中還有目錄,那么當你直接rmdir 該目錄時,會提示該目錄不為空,不能刪除如果你非要刪除不為空的目錄,那你用rm指令吧。

rm刪除目錄或者文件

rmdir 只能刪除目錄但不能刪除文件,要想刪除一個文件,則要用rm命令了。rm同樣也有很多選項你可以通過 man rm 來獲得詳細幫助信息。在這里筆者只列舉較常用的幾個選項。

-f 強制的意思,如果不加這個選項,當刪除一個不存在的文件時會報錯

6_18.png.jpg

-i 這個選項的作用是,當用戶刪除一個文件時會提示用戶是否真的刪除。

6_19.png.jpg

如果刪除,輸入y 否則輸入 n

-r 當刪除目錄時,加該選項,如果不加這個選項會報錯。rm是可以刪除不為空的目錄的。

6_20.png.jpg

你會發(fā)現(xiàn),筆者在列舉的rm例子中使用的是絕對路徑,而ls 則使用的相對路徑。這是為什么呢?

6_21.png.jpg

which 用來查找一個命令的絕對路徑,這個命令筆者不詳細介紹,因為平時筆者只用來查找一個命令的絕對路徑。

alias用來設置指令的別名。語法:alias[別名]=[指令名稱],例如 alias rm='rm -i' ,即當我們使用rm命令時,實際上是使用的是rm –i ,而用絕對路徑的/bin/rm 則不會被alias,該命令在以后章節(jié)中會詳細介紹

環(huán)境變量 PATH

上邊提到了alias,也提到了絕對路徑的/bin/rm ,然后你意識到?jīng)]有,為什么我們輸入很多命令時是直接打出了命令,而沒有去使用這些命令的絕對路徑?這是因為環(huán)境變量PATH在起作用了。請輸入 echo $PATH,這里的echo其實就是打印的意思,而PATH前面的$表示后面接的是變量。

6_65.png.jpg

因為/bin PATH的設定中,所以自然就可以找到ls如果你將 ls 移動到 /root 底下的話,然后你自己本身也在 /root 底下,但是當你執(zhí)行 ls 的時候,他就是不理你?怎么辦?這是因為 PATH 沒有 /root 這個目錄,而你又將 ls 移動到 /root 底下了,自然系統(tǒng)就找不到可執(zhí)行文件了,因此就會告訴你, command not found !那么該怎么克服這種問題呢?

有兩個方法,一種方法是直接將 /root 的路徑加入 PATH 當中!如何增加?可以使用:  

PATH=”$PATH”:/root

另一種方式則是使用完整檔名,亦即直接使用相對或絕對路徑來執(zhí)行,例如:

/root/ls

./ls

關(guān)于rm,筆者使用最多便是-rf兩個選項合用了。不管刪除文件還是目錄都可以。但是方便的同時也要多注意,萬一你的手太快后邊跟了/那樣就會把你的系統(tǒng)文件全部刪除的,切記切記。

6_66.png.jpg

ls 在前面的命令中多次用到它。現(xiàn)在你已經(jīng)明白它的含義了吧。沒有錯,就是查看某個目錄或者某個文件,是list的簡寫。ls 后可以跟一個目錄,也可以跟一個文件以下是ls的選項,在這里筆者并沒有完全列出,只是列出了平時使用最多的選項其他選項,你可以自行通過man ls 查詢。

-a 全部的檔案都列出,包括隱藏的。linux文件系統(tǒng)中同樣也有隱藏文件。這些隱藏文件的文件名是以.開頭的。例如.test, /root/.123, /root/.ssh 等等,隱藏文件可以是目錄也可以是普通文件。

-l 詳細列出文件的屬性信息,包括大小、創(chuàng)建日期所屬主所屬組等等。ll 這個命令等同于ls –l 。

6_67.png.jpg

--color=never/always/auto never即不要顯示顏色,always 即總顯示顏色,auto 是由系統(tǒng)自行判斷。Redhat/CentOS 系統(tǒng)中,默認是帶顏色的,因為我們平時用的ls已經(jīng)alias成了ls –color=tty 所以目錄的顏色是藍色的,而可執(zhí)行文件的顏色是綠色這樣有助于幫我們區(qū)分文件的格式

6_68.png.jpg

-d 后邊跟目錄,如果不加這個選項則列出目錄下的文件,加上后只列車目錄本身。

6_69.png.jpg

cp copy的簡寫,即拷貝。格式為 cp [選項] [ 來源文件 ] [目的文件] ,例如我想把test1 拷貝成test2 ,這樣即可 cp test1 test2,以下介紹幾個常用的選項

-d 這里涉及到一個連接的概念連接分為軟連接和硬連接。在以后的章節(jié)中會詳細解釋,現(xiàn)在你只要明白這里的軟連接跟windows中的快捷方式類似即可。如果不加這個-d 則拷貝軟連接時會把軟連接的目標文件拷貝過去,而加上后,其實只是拷貝了一個連接文件(即快捷方式)。

6_70.png.jpg

上例中的ln 命令即為建立連接的,以后再做詳細解釋

-r 如果你要拷貝一個目錄,必須要加-r選項,否則你是拷貝不了目錄的。

6_71.png.jpg

-i 如果遇到一個存在的文件,會問是否覆蓋。Redhat/CentOS系統(tǒng)中,我們使用的cp其實是cp –i

6_72.png.jpg

下面簡單做一個小試驗,很快你就會明白-i 選項的作用了。

6_73.png.jpg

上例中,touch 命令,看字面意思就是摸一下,沒錯,如果有這個文件,則會改變文件的訪問時間,如果沒有這個文件就會創(chuàng)建這個文件。前面說過echo,其實就是打印,在這里所echo的內(nèi)容”abc” “def”并沒有顯示在屏幕上,而是分別寫進了文件 111222, 其寫入作用的就是這個大于號”>” linux中這叫做重定向,即把前面產(chǎn)生的輸出寫入到后面的文件中在以后的章節(jié)中會做詳細介紹,這里你要明白它的含義即可cat 命令則是讀一個文件,并把讀出的內(nèi)容打印到當前屏幕上該命令也會在后續(xù)章節(jié)中詳細介紹。

-u 該選項僅當目標文件存在時才會生效,如果源文件比目標文件新才會拷貝,否則不做任何動作

mv 移動的意思,是move的簡寫。格式為 mv [ 選項 ] [源文件] [目標文件],下面介紹幾個常用的選項。

-i cp-i 一樣,當目標文件存在時會問用戶是否要覆蓋。Redhat/CentOS系統(tǒng)中,我們使用的mv其實是mv –i

-u 和上邊cp 命令的-u選項一個作用,當目標文件存在時才會生效,如果源文件比目標文件新才會移動,否則不做任何動作。

該命令有集中情況,你注意到了嗎?

1目標文件是目錄,而且目標文件不存在;

2目標文件是目錄,而且目標文件存在;

3目標文件不是目錄不存在;

4目標文件不是目錄存在;

目標文件是目錄,存在和不存在,移動的結(jié)果是不一樣的,如果存在,則會把源文件移動到目標文件目錄中。不存在的話移動完后,目標文件是一個文件。這樣說也許你會覺得有點不好理解,看例子吧

6_74.png.jpg

windows下的重命名,在linux下用mv就可以搞定。

cat 比較常用的一個命令,即查看一個文件的內(nèi)容并顯示在屏幕上。

-n 查看文件時,把行號也顯示到屏幕上。

6_75.png.jpg

上例中出現(xiàn)了一個”>>”,這個符號跟前面介紹的”>”的作用都是重定向,即把前面輸出的東西輸入到后邊的文件中,只是”>>”是追加的意思,而用”>”,如果文件中有內(nèi)容則會刪除文件中內(nèi)容,而”>>”則不會。

-A 顯示所有東西出來,包括特殊字符

6_76.png.jpg

tac其實是cat的反寫,同樣的功能也是反向打印文件的內(nèi)容到屏幕上。

6_77.png.jpg

more也是用來查看一個文件的內(nèi)容。當文件內(nèi)容太多,一屏幕不能占下,而你用cat肯定是看不前面的內(nèi)容的,那么使用more就可以解決這個問題了。當看完一屏后按空格鍵繼續(xù)看下一屏。但看完所有內(nèi)容后就會退出。如果你想提前退出,只需按q鍵即可

less作用跟more一樣,但比more好在可以上翻,下翻。空格鍵同樣可以翻頁,而按”j”鍵可以向下移動(按一下就向下移動一行),按”k”鍵向上移動。在使用moreless查看某個文件時,你可以按一下”/” 鍵,然后輸入一個word回車,這樣就可以查找這個word。如果是多個該word可以按”n”鍵顯示下一個。另外你也可以不按”/”而是按”?”后邊同樣跟word來搜索這個word,唯一不同的是,”/”是在當前行向下搜索,而”?”是在當前行向上搜索。

head head后直接跟文件名,則顯示文件的前十行。如果加 –n 選項則顯示文件前n。

6_78.png.jpg

tail head一樣,后面直接跟文件名,則顯示文件最后十行。如果加-n 選項則顯示文件最后n。

6_79.png.jpg

-f 動態(tài)顯示文件的最后十行,如果文件是不斷增加的,則用-f 選項。如:tail -f /var/log/messages

文件的所屬主以及所屬組

一個linux目錄或者文件,都會有一個所屬主和所屬組。所屬主,即文件的擁有者,而所屬組,即該文件所屬主所在的一個組。Linux這樣設置文件屬性的目的是為了文件的安全。例如,test文件的所屬主是user0 test1文件的所屬主是user1,那么user1是不能查看test文件的,相應的user0也不能查看test1文件。然后有這樣一個應用,我想創(chuàng)建一個文件同時讓user0user1來查看怎么辦呢?

這時所屬組就派上用場了。即,創(chuàng)建一個群組users,讓user0user1同屬于users組,然后建立一個文件test2,且其所屬組為users,那么user0user1都可以訪問test2文件。

Linux文件屬性不僅規(guī)定了所屬主和所屬組,還規(guī)定了所屬主(user、所屬組(group)以及其他用戶(others)對該文件的權(quán)限。你可以通過ls -l 來查看這些屬性。

6_80.png.jpg

linux 文件屬性

上例中,用ls –l 查看當前目錄下的文件時,共顯示了9列內(nèi)容(用空格劃分列),都代表了什么含義呢?

1列,包含的東西有該文件類型和所屬主、所屬組以及其他用戶對該文件的權(quán)限。第一列共10。其中第一位用來描述該文件的類型上例中,我們看到的類型有”d”, “-“ ,其實除了這兩種外還有”l”, “b”, “c”,”s”。

d 表示該文件為目錄;

- 表示該文件為普通文件;

l 表示該文件為連接文件(linux file),上邊提到的軟連接即為該類型;

6_81.png.jpg

b 表示該文件為塊設備文件,比如磁盤分區(qū)

6_82.png.jpg

c 表示該文件為串行端口設備,例如鍵盤、鼠標。

s 表示該文件為套接字文件(socket),用于進程間通信。

后邊的9位,每三個為一組。均為rwx 三個參數(shù)的組合。其中r 代表可讀,w代表可寫,x代表可執(zhí)行。前三位為所屬主(user)的權(quán)限,中間三位為所屬組(group)的權(quán)限,最后三位為其他非本群組(others)的權(quán)限。下面拿一個具體的例子來述說一下

一個文件的屬性為-rwxr-xr-- ,它代表的意思是,該文件為普通文件,文件擁有者可讀可寫可執(zhí)行,文件所屬組對其可讀不可寫可執(zhí)行,其他用戶對其只可讀。

對于一個目錄來講,打開這個目錄即為執(zhí)行這個目錄,所以任何一個目錄必須要有x權(quán)限才能打開并查看該目錄。例如一個目錄的屬性為 drwxr--r-- 其所屬主為root,那么除了root外的其他用戶是不能打開這個目錄的。

2列,表示為連接占用的節(jié)點(inode),若為目錄時,通常與該目錄地下還有多少目錄有關(guān)系,關(guān)于連接(link)在以后章節(jié)詳細介紹

3列,表示該文件的所屬主

4列,表示該文件的所屬組

5列,表示該文件的大小。

6、7列和第8列為該文件的創(chuàng)建日期或者最近的修改日期,分別為月份日期以及時間

9列,文件名。如果前面有一個. 則表示該文件為隱藏文件。

更改文件的權(quán)限

更改文件的權(quán)限,也就是更改所屬主、所屬組以及他們對應的讀寫執(zhí)行權(quán)限。

1更改所屬組 chgrp

語法:chgrp [組名] [文件名]

?

6_83.png.jpg

這里用到了groupadd 命令,其含義即增加一個用戶組該命令在以后章節(jié)中做詳細介紹,你只要知道它是用來增加用戶組的即可。

2更改文件的所屬主 chown

語法:chown [ -R ] 賬戶名文件名

chown [ -R ] 賬戶名:組名文件名

這里的-R選項只作用于目錄,作用是級聯(lián)更改,即不僅更改當前目錄,連目錄里的目錄或者文件全部更改。

6_84.png.jpg

useradd 是增加一個賬戶,以后會詳細介紹。上例中,首先建立一個目錄test,然后在test目錄下創(chuàng)建一個普通文件test2,因為是以root的身份創(chuàng)建的目錄和文件,所以所屬主以及所屬組都是root。chown user1 test 這使test的目錄所屬主由root變?yōu)榱?/span>user1 ,然后test目錄下的test2文件所屬主以及所屬組還是root。接著 chown –R user1:testgroup test 這樣把test連同test目錄下的test2 的所屬主以及所屬組都改變了

3改變用戶對文件的讀寫執(zhí)行權(quán)限 chmod

linux中為了方便更改這些權(quán)限,linux使用數(shù)字去代替rwx ,具體規(guī)則為r: 4 w:2 x:1 -:0 舉個例子,-rwxrwx---用數(shù)字表示就是 770,具體是這樣來的:

rwx = 4+2+1=7; rwx= 4+2+1=7; --- = 0+0+0=0

chmod 語法: chmod [-R] xyz 文件名(這里的xyz,表示數(shù)字)

-R 選項作用同chown,級聯(lián)更改。

值得提一下的是,在linux系統(tǒng)中,默認一個目錄的權(quán)限為 755,而一個文件的默認權(quán)限為644.

6_85.png.jpg

如果你創(chuàng)建了一個目錄,而該目錄不想讓其他人看到內(nèi)容,則只需設置成 rwxr----- (740) 即可。

chmod 還支持使用rwx的方式來設置權(quán)限。!從之前的介紹中我們可以發(fā)現(xiàn),基本上就九個屬性分別是(1)user (2)group (3)others 三群啦!那么我們就可以藉由 u, g, o 來代表三群的屬性!此外, a 則代表 all 亦即全部的三群!那么讀寫的屬性就可以寫成了 r, w, x!也就是可以使用底下的方式來看:

6_86.png.jpg

現(xiàn)在我想把一個文件設置成這樣的權(quán)限 rwxr-xr-x (755),使用這種方式改變權(quán)限的命令為

6_87.png.jpg

另外還可以針對u, g, o, a增加或者減少某個權(quán)限(讀,寫,執(zhí)行),例如

6_88.png.jpg

另外linux下還有兩個比較特殊的權(quán)限s和t,請點擊linux下文件的特殊權(quán)限s和t

umask

上邊也提到了默認情況下,目錄權(quán)限值為766,普通文件權(quán)限值為644。那么這個值是由誰規(guī)定呢?追究其原因就涉及到了umask。

umask語法: umask xxx (這里的xxx代表三個數(shù)字)

查看umask值只要輸入umask然后回車。 umask預設是0022,其代表什么含義?先看一下下面的規(guī)則:

1)若用戶建立為普通文件,則預設沒有可執(zhí)行權(quán)限,只有rw兩個權(quán)限。最大為666-rw-rw-rw-

2)若用戶建立為目錄,則預設所有權(quán)限均開放,即777drwxrwxrwx

umask數(shù)值代表的含義為,上邊兩條規(guī)則中的默認值(文件為666,目錄為777)需要減掉的權(quán)限。所以目錄的權(quán)限為(rwxrwxrwx) – (----w--w-) = (rwxr-xr-x),普通文件的權(quán)限為(rw-rw-rw-) – (----w--w-) = (rw-r--r--)。umask的值是可以自定義的,比如設定umask 002,你再創(chuàng)建目錄或者文件時,默認權(quán)限分別為(rwxrwxrwx) – (-------w-) = (rwxrwxr-x)(rw-rw-rw-) – (-------w-) = (rw-rw-r--)。

6_89.png.jpg

umask 可以在/etc/bashrc里面更改,預設情況下,rootumask022,而一般使用者則為002,因為可寫的權(quán)限非常重要,因此預設會去掉寫權(quán)限

chattr 修改文件的特殊屬性

語法: chattr [+-=][ASaci [文件或者目錄名]

+-= :分別為增加、減少、設定

A:增加該屬性后,文件或目錄的atime將不可被修改;

S:增加該屬性后,會將數(shù)據(jù)同步寫入磁盤中;

a:增加該屬性后,只能追加不能刪除,非root用戶不能設定該屬性;

c:自動壓縮該文件,讀取時會自動解壓;

i:增加后,使文件不能被刪除重命名、設定連接、寫入、新增數(shù)據(jù);

6_90.png.jpg

增加i屬性后不能在該目錄中建立文件。

6_91.png.jpg

增加a屬性后,只能追加不能刪除。

lsattr 列出文件/目錄的特殊屬性

語法: lsattr [-aR] [文件/目錄名]

-a:類似與ls -a 選項,即連同隱藏文件一同列出;

-R:連同子目錄的數(shù)據(jù)一同列出

6_92.png.jpg

在上例中,test4是在test3目錄增加a屬性后建立的,所以test4也有a屬性,通過這個例子可以看出,chattr 的屬性是級聯(lián)生效的,不僅對當前目錄生效而且會對目錄下的文件同樣生效。

在 linux 下搜索一個文件

windows下有一個搜索工具,可以讓我們很快的找到一個文件,這是很有用的。然而在linux下搜索功能更加強大。

which用來查找可執(zhí)行文件的絕對路徑。

在前面章節(jié)中已經(jīng)多次用到該命令,需要注意的一點是,which只能用來查找PATH環(huán)境變量中出現(xiàn)的路徑下的可執(zhí)行文件。這個命令用的也是蠻多的,有時候我們不知道某個命令的絕對路徑,which一下很容易就知道了

6_93.png.jpg

當查找的文件在PATH變量中并沒有時,就會報錯。

whereis 通過預先生成的一個文件列表庫去查找跟給出的文件名相關(guān)的文件。

語法: whereis [-bmsu] [文件名稱]

-b:只找binary 文件

-m:只找在說明文件manual路徑下的文件

-s:只找source來源文件

-u:沒有說明檔的文件

6_94.png.jpg

說明:whereis 筆者幾乎很少用到,如果你感興趣請深入研究。

locate類似于whereis,也是通過查找預先生成的文件列表庫來告訴用戶要查找的文件在哪里。后邊直接跟文件名。如果你的linux沒有這個命令,請安裝軟件包 mlocate ,這個軟件包在你的系統(tǒng)安裝盤里,后綴名是RPM,隨后介紹的find命令會告訴你如何查找這個包。如果你裝的CentOS你可以使用這個命令來安裝 yum install –y mlocate 。 前提是你的CentOS能連互聯(lián)網(wǎng)。至于yum這個命令如何使用,到后續(xù)章節(jié)你自然會明白如果你剛裝上這個命令,初次使用會報錯。

6_95.png.jpg

這是因為系統(tǒng)還沒有生成那個文件列表庫你可以使用updatedb 命令立即生成(更新)這個庫。如果你的服務器上正跑著重要的業(yè)務,那么你最好不要去運行這個命令,因為一旦運行,服務器的壓力會變大這個數(shù)據(jù)庫默認情況下每周更新一次。所以你用locate命令去搜索一個文件,正好是在兩次更新時間段內(nèi),那你肯定是得不到結(jié)果的。你可以到/etc/updated.conf 去配置這個數(shù)據(jù)庫生成(更新)的規(guī)則。locate命令筆者用的也并不多,所以你只要明白有這么一個東西即可你用到時再去深究其用法吧。

find 這個搜索工具是筆者用的最多的一個,所以請你務必要熟悉它。

語法: find [路徑] [參數(shù)] 下面介紹幾個筆者經(jīng)常用的參數(shù)

-atime +n :訪問或執(zhí)行時間大于n天的文件

-ctime +n :寫入、更改inode屬性(例如更改所有者權(quán)限或者連接)時間大于n天的文件

-mtime +n :寫入時間大于n天的文件

看到這里,你對這三個time是不是有些暈了,那筆者就先給你介紹一下這三個time屬性。

文件的 Access time,atime 是在讀取文件或者執(zhí)行文件時更改的。文件的 Modified time,mtime 是在寫入文件時隨文件內(nèi)容的更改而更改的。文件的 Create time,ctime 是在寫入文件、更改所有者、權(quán)限或鏈接設置時隨 Inode 的內(nèi)容更改而更改的。 因此,更改文件的內(nèi)容即會更改 mtime ctime,但是文件的 ctime 可能會在 mtime 未發(fā)生任何變化時更改,例如,更改了文件的權(quán)限,但是文件內(nèi)容沒有變化 如何獲得一個文件的atime mtime 以及ctime ?

ls -l 命令可用來列出文件的 atime、ctime mtime。

ls -lc filename? ?? ?? ?列出文件的 ctime

ls -lu filename? ?? ?? ?列出文件的 atime

ls -l filename? ?? ?? ? 列出文件的 mtime ? ?

atime不一定在訪問文件之后被修改,因為:使用ext3文件系統(tǒng)的時候,如果在mount的時候使用了noatime參數(shù)那么就不會更新atime的信息。而這是加了 noatime 取消了, 不代表真實情況。反正, 這三個 time stamp 都放在 inode 。 mtime, atime 修改inode 就一定會改, 既然 inode 改了, ctime 也就跟著要改了

繼續(xù)講find常用的參數(shù)。

-name filename 直接查找該文件名的文件,這個使用最多了。

6_96.png.jpg

-type type :通過文件類型查找文件類型在前面部分已經(jīng)簡單介紹過,相信你已經(jīng)大體上了解了。type 包含了 f, b, c, d, l, s 等等。后續(xù)的內(nèi)容還會介紹文件類型的。

6_97.png.jpg

linux 的文件系統(tǒng)

搞計算機的應該都知道windows的系統(tǒng)格式化硬盤時會指定格式,fat 或者 ntfs。linux的文件系統(tǒng)格式為Ext2,或者Ext3 。早期的linux使用Ext2格式,目前的linux都使用了Ext3。 Ext2文件系統(tǒng)雖然是高效穩(wěn)定的但是,隨著Linux系統(tǒng)在關(guān)鍵業(yè)務中的應用,Linux文件系統(tǒng)的弱點也漸漸顯露出來了,因為Ext2文件系統(tǒng)是非日志文件系統(tǒng)。這在關(guān)鍵行業(yè)的應用是一個致命的弱點。Ext3文件系統(tǒng)是直接從Ext2文件系統(tǒng)發(fā)展而來,Ext3文件系統(tǒng)帶有日志功能,可以跟蹤記錄文件系統(tǒng)的變化,并將變化內(nèi)容寫入日志,寫操作首先是對日志記錄文件進行操作,若整個寫操作由于某種原因 (如系統(tǒng)掉電) 而中斷,系統(tǒng)重啟時,會根據(jù)日志記錄來恢復中斷前的寫操作,而且這個過程費時極短目前Ext3文件系統(tǒng)已經(jīng)非常穩(wěn)定可靠。它完全兼容Ext2文件系統(tǒng)用戶可以平滑地過渡到一個日志功能健全的文件系統(tǒng)中來。這實際上了也是ext3日志文件系統(tǒng)初始設計的初衷

Linux文件系統(tǒng)在windows中是不能識別的,但是在linux系統(tǒng)中你可以掛載的windows的文件系統(tǒng),linux目前支持MS-DOSVFAT,FAT,BSD等格式。如果你使用的是Redhat或者CentOS,那么你不要妄圖掛載NFS格式的文件到linux下,因為它不支持NFS。雖然有些版本的linux支持NFS,但不建議使用,因為目前的技術(shù)還不成熟。

Ext3文件系統(tǒng)為Redhat/CentOS默認使用的文件系統(tǒng),除了Ext3文件系統(tǒng)外,有些linux發(fā)行版例如SuSE默認的文件系統(tǒng)為reiserFS ,Ext3 獨特的優(yōu)點就是易于轉(zhuǎn)換,很容易在 Ext2 Ext3 之間相互轉(zhuǎn)換,而具有良好的兼容性,其它優(yōu)點 ReiserFS 都有,而且還比它做得更好。如高效的磁盤空間利用和獨特的搜尋方式都是Ext3 所不具備的,速度上它也不能和 ReiserFS相媲美,在實際使用過程中,reiserFS 也更加安全高效,據(jù)說反刪除功能也不錯。

ReiserFS 的優(yōu)勢在于,它是基于 B*Tree 快速平衡樹這種高效算法的文件系統(tǒng),例如在處理小于 1k 的文件比 Ext3 10 。再一個就是 ReiserFS 空間浪費較少,它不會對一些小文件分配 inode,而是打包存放在同一個磁盤塊 () 中,Ext2/Ext3 是把它們單獨存放在不同的簇上,如簇大小為 4k,那么 2 100 字節(jié)的文件會占用 2 個簇,ReiserFS 則只占用一個當然 ReiserFS 也有缺點,就是每升級一個版本,都要將磁盤重新格式化一次。

linux 文件類型

在前面的內(nèi)容中簡單介紹了普通文件(-),目錄(d)等,在linux文件系統(tǒng)中,主要有以下幾種類型的文件。

1)正規(guī)文件(regular file):就是一般類型的文件,當用ls –l 查看某個目錄時,第一個屬性為”-“的文件就是正規(guī)文件,或者叫普通文件正規(guī)文件又可分成純文字文件(ascii)和二進制文件(binary。純文本文件是可以通過cat, more, less等工具直接查看內(nèi)容的,而二進制文件并不能。例如我們用的命令/bin/ls 這就是一個二進制文件。

2)目錄(directory):這個很容易理解,就是目錄,跟windows下的文件夾一個意思,只不過在linux中我們不叫文件夾,而是叫做目錄。ls –l 查看第一個屬性為”d”。

3)連接檔(link):ls –l 查看第一個屬性為 “l(fā)”,類似windows下的快捷方式。這種文件在linux中很常見,而且筆者在日常的系統(tǒng)運維工作中用的很多,所以你要特意留意一下這種類型的文件。在后續(xù)章節(jié)筆者會介紹。

4)設備檔(device):與系統(tǒng)周邊相關(guān)的一些檔案,通常都集中在 /dev 這個目錄之下!通常又分為兩種:區(qū)塊 (block) 設備檔:就是一些儲存數(shù)據(jù),以提供系統(tǒng)存取的接口設備,簡單的說就是硬盤啦!例如你的一號硬盤的代碼是 /dev/hda1 等等的檔案啦!第一個屬性為 “ b “;字符 (character) 設備檔:亦即是一些串行端口的接口設備,例如鍵盤、鼠標等等!第一個屬性為 “ c “。

* linux 文件后綴名

對于后綴名這個概念,相信你不陌生吧。linux系統(tǒng)中,文件的后綴名并沒有具體意義,也就是說,你加或者不加,都無所謂。但是為了容易區(qū)分,linux愛好者們都習慣給文件加一個后綴名,這樣當用戶看到這個文件名時就會很快想到它到底是一個什么文件。例如1.sh, 2.tar.gz, my.cnf, test.zip等等,如果你首次接觸這些文件,你也許會感到很暈,沒有關(guān)系,隨著學習的深入,你就會逐漸的了解這些文件了。筆者所列舉的幾個文件名中1.sh代表它是一個shell script 2.tar.gz 代表它是一個壓縮包,my.cnf 代表它是一個配置文件,test.zip 代表它是一個壓縮文件。

另外需要你知道的是,早期Unix系統(tǒng)文件名最多允許14個字符,而新的Unix或者linux系統(tǒng)中,文件名最長可以到達 256 個字符!

linux 中的連接檔

在講連接檔之前,需要你先理解inode的概念什么是inode呢?這就需要你知道磁盤的整體構(gòu)造。磁盤是有多個盤片(類似與光盤)重疊在一起構(gòu)成的,而每個盤片上會有一個可以移動的磁頭,這個磁頭的作用就是用來讀寫數(shù)據(jù)的磁頭并不是一直在動,當磁頭固定時,盤片轉(zhuǎn)一圈,這一圈就是一個磁道了很多個盤片同半徑的那一圈的磁道總和稱為磁柱。而由圓心向外畫出直線,可以得到一個個扇區(qū),如圖二所示,一個扇區(qū)的物理量大約是 512 bytes ( 0.5K )。

6_98.png.jpg

圖一

6_99.png.jpg

圖二

知道了大體的硬盤構(gòu)造之后,再來談一談怎么硬盤分割( partition )呢?我們在進行硬盤分割的時候,最小都是以磁柱為單位進行分割的,那么分割完成之后自然就是格式化( format )啰,在 Linux 里面我們在進行格式化的時候必須要考慮到 Block inode 的信息,這個 block 還好理解,他是我們磁盤可以記錄的最小單位,是由數(shù)個 sector 所組成的,所以他的大小通常為 n*512 bytes ,例如 4K 。那么 inode 是什么? Block 是記錄檔案內(nèi)容數(shù)據(jù)的地區(qū),而 inode 則是記錄該檔案的屬性、及該檔案放置在哪一個 Block 之內(nèi)的信息!所以,每個檔案都會占用到至少一個 inode 。而當我們 Linux 系統(tǒng)要找到這個檔案時,他會先去搜尋 inode table 找到這個檔案的屬性及數(shù)據(jù)放置的地區(qū),然后再到數(shù)據(jù)去找到數(shù)據(jù)存放的 Block 進而將數(shù)據(jù)取出利用這個 inode 數(shù)目在一開始就會被設定好,他的設定方式通常是利用 ( 硬盤大小 / 一個容量 ),這個容量至少應該比 Block 要大一些較佳,例如剛剛的 Block 訂為 4K ,那么 inode 可以訂為 8K 左右。所以,一顆 1GB 的硬盤,如果以 8K 來規(guī)劃他的 inode 數(shù)時,他的 inode 就會有 131072 inode 啦!而一個 inode 的大小為 128 bytes 這么大!這么一來的話,我們就可以清楚的知道了,那就是一個 partition 格式化為一個 filesystem 之后,基本上,他一定會有 inode table data area 兩個區(qū)塊,一個用來記錄檔案的信息與該檔案放置的 block 區(qū)塊,一個用來記錄檔案的內(nèi)容!

由于我們 Linux 在讀取數(shù)據(jù)的時候,是先查詢 inode table 以得到數(shù)據(jù)是放在那個 Block 里面,然后再去該 Block 里面讀取真正的數(shù)據(jù)內(nèi)容!然后,那個 block 是我們在格式化硬盤的時候規(guī)定出來的一個值,這個 block 是由 2 n 次方個sector 所集結(jié)而成的!所以,他是 0.5K 的倍數(shù)!假設我們 block 規(guī)劃為 4KBytes 好了,那么由于一個 inode 與一個block 最多均只紀錄一個檔案,所以,如果你的一個檔案有 0.1 K bytes 這么大時,你要曉得的是,由于你的 block 4K bytes ,因此,你就會有 3.9 Kbytes 的空間浪費掉!所以,當你在格式化硬盤的時候,請千萬注意到你的系統(tǒng)未來的使用方向。

ln 建立連接檔

前面提到過兩次連接檔的概念,現(xiàn)在終于該好好介紹下這部分內(nèi)容了連接檔分為兩種,硬連接(hard link)和軟連接(symbolic link。

Hard Links上面內(nèi)容中說過,當系統(tǒng)要讀取一個文件時,就會先去讀inode table,然后再去根據(jù)inode中的信息到塊區(qū)域去將數(shù)據(jù)取出來。hard link 是直接再建立一個inode連接到文件放置的塊區(qū)域也就是說,進行hard link的時候?qū)嶋H上該文件內(nèi)容沒有任何變化,只是增加了一個指到這個文件的inode,不過這樣一來就會有個問題,因為增加的inode會連接到塊區(qū)域,而目錄本身僅僅消耗inode而已,那么hard link就不能連接目錄了。請你記住,hard link 有兩個限制:1 不能跨文件系統(tǒng),因為不通的文件系統(tǒng)有不同的inode table 2 不能連接目錄。

Symbolic Linkshard link不同,這個是建立一個獨立的文件,而這個文件的作用是當讀取這個連接文件時,它會把讀取的行為轉(zhuǎn)發(fā)到該文件所link的文件上。這樣講,也許比較繞口,那么就來舉一個例子現(xiàn)在有文件a,我們做了一個軟連接文件b(只是一個連接文件,非常?。?/span>b指向了文件a。當讀取b時,那么b就會把讀取的動作轉(zhuǎn)發(fā)到a上,這樣就讀取到了文件a。所以,當你刪除文件a時,文件b并不會被刪除,但是再讀取b時,會提示無法打開文件而,當你刪除b時,a是不會有任何影響的。

看樣子,似乎 hard link 比較安全,因為即使某一個 inode 被殺掉了,只要有任何一個 inode 存在,那么該文件就不會不見!不過,不幸的是,由于 Hard Link 的限制太多了,包括無法做目錄的 link ,所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方向較廣!那么如何建立軟連接和硬連接呢?這就用到了ln 命令。

ln 語法: ln [-s] [來源文件] [目的文件]

ln 常用的選項就一個-s ,如果不加就是建立硬連接,加上就建立軟連接。

6_100.png.jpg

在建立硬連接前后,123目錄所占空間大小并沒有改變。

6_101.png.jpg

當把源文件刪除后,空間仍舊沒有變化說明了刪除一個文件其實只是刪除了inode信息。

6_102.png.jpg

不能創(chuàng)建目錄的硬連接。

6_103.png.jpg

建立軟連接后,456目錄增加了4k

6_104.png.jpg

刪除源文件后會提示沒有這個文件的錯誤。

6_105.png.jpg

目錄是可以軟連接的。

6_106.png.jpg

刪除軟連接對源文件沒有任何影響。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號