與Linux檔案和目錄管理相關的一些重要命令

pythontab發表於2013-04-26

一、修改檔案時間與建立新檔案


在上一篇隨筆介紹ls命令時,就有提到每個檔案在Linux下面都會記錄3個主要的修改時間:


modification time (mtime): 當該檔案的 內容資料 變更時,就會更新這個時間!內容資料指的是檔案的內容,而不是檔案的屬性或許可權!

status time (ctime): 當該檔案的 狀態 (status) 改變時,就會更新這個時間,例如如果像是許可權與屬性被更改了,都會更新這個時間啊。

access time (atime): 當 該檔案的內容被修改 時,就會更新這個讀取時間 (access)。舉例來說,我們使用 cat 去讀取 /etc/passwd, 就會升級該檔案的 atime。


[root@xiaoluo ~]# ls -l /etc/passwd

-rw-r--r--. 1 root root 2679 4月   6 14:05 /etc/passwd

[root@xiaoluo ~]# ls -l --time=atime /etc/passwd

-rw-r--r--. 1 root root 2679 4月  25 20:56 /etc/passwd

[root@xiaoluo ~]# ls -l --time=ctime /etc/passwd

-rw-r--r--. 1 root root 2679 4月  21 20:38 /etc/passwd


在預設情況下,ls顯示的是該檔案的 mtime ,也就是這個檔案的內容上次更改的時間。

在Linux系統中,檔案的時間非常的重要,因為如果誤判檔案時間,可能就會造成某些程式無法順利執行。但是,萬一我們發現一個檔案的時間不對頭,例如時間變成了未來的某個時間(這種現象在我們安裝Linux系統時會出現這個情況),此時我們如何將該檔案的時間變成"現在"的正常時間呢?這裡就要用到本篇隨筆要介紹的第一個命令了——touch命令。


1. touch 命令  (修改檔案時間與建立新檔案)



[root@xiaoluo ~]# touch [-acdmt] 檔案

選項與引數:

-a  :僅修訂 access time;

-c  :僅修改檔案的時間,若該檔案不存在則不建立新檔案;

-d  :後面可以接欲修訂的日期而不用目前的日期,也可以使用 --date="日期或時間"

-m  : 僅修改 mtime ;

-t  : 後面可以接欲修訂的時間而不用目前的時間,格式為[YYMMDDhhmm]


接下來我們透過一些例項來看一下touch命令的這幾個引數的使用方法:



例項一:新建一個空的檔案

[root@xiaoluo ~]# cd /home/

[root@xiaoluo home]# touch test.txt

[root@xiaoluo home]# ls -l test.txt

-rw-r--r--. 1 root root 0 4月  25 22:07 test.txt

# 注意,這個檔案的大小是 0 !在預設的狀態下,如果 touch 後面有接檔案,

# 則該檔案的三個時間 (atime/ctime/mtime) 都會更新為目前的時間。若該檔案不存在,

# 則會主動的建立一個新的空的檔案!!


例項二:將 ~/.bashrc 複製成為 bashrc,假設複製完全的屬性,檢查其日期

[root@xiaoluo home]# cp -a ~/.bashrc bashrc

[root@xiaoluo home]# ls -l bashrc

-rw-r--r--. 1 root root 177 4月   8 22:43 bashrc     <==這是 mtime

[root@xiaoluo home]# ls -l --time=atime bashrc

-rw-r--r--. 1 root root 177 4月  25 21:48 bashrc     <==這是 atime

[root@xiaoluo home]# ls -l --time=ctime bashrc

-rw-r--r--. 1 root root 177 4月  25 22:08 bashrc     <==這是 ctime


例項三:修改例項二的bashrc檔案,將日期調整為三天前

[root@xiaoluo home]# touch -d "3 days ago" bashrc

[root@xiaoluo home]# ls -l bashrc ; ls -l --time=atime bashrc ; ls -l --time=ctime bashrc

-rw-r--r--. 1 root root 177 4月  22 22:12 bashrc  <==這是 mtime

-rw-r--r--. 1 root root 177 4月  22 22:12 bashrc  <==這是 atime

-rw-r--r--. 1 root root 177 4月  25 22:12 bashrc  <==這是 ctime

# 注意,日期在 atime 與 mtime 都改變了,但是 ctime 並沒有改變!



例項四:將例項三的bashrc日期改為 2013/4/24 23:23

[root@xiaoluo home]# touch -t 1304242323 bashrc

[root@xiaoluo home]# ls -l bashrc ; ls -l --time=atime bashrc ; ls -l --time=ctime bashrc

-rw-r--r--. 1 root root 177 4月  24 23:23 bashrc  <==這是 mtime

-rw-r--r--. 1 root root 177 4月  24 23:23 bashrc  <==這是 atime

-rw-r--r--. 1 root root 177 4月  25 22:11 bashrc  <==這是 ctime

# 注意,日期在 atime 與 mtime 都改變了,但是 ctime 則是記錄目前的時間!


透過touch這個命令,我們就可以輕鬆的改變檔案的日期和時間,並且會建立一個空檔案。


【注意】:當我們複製一個檔案,並且複製了檔案的所有屬性,也沒有辦法改變該檔案的ctime屬性。ctime可以記錄檔案最近改變狀態的時間。不過我們平常看到的檔案屬性中,我們最常關心的還是該檔案的mtime,即該檔案最近被修改的時間。


touch命令最常用的情況:


建立一個空的檔案;

將某個檔案日期修改為目前 (mtime 與 atime)

二、檔案與目錄的預設許可權與隱藏許可權


1.umask (檔案預設許可權)


在之前的隨筆當中我們已經學習瞭如何建立或者是改變一個目錄或檔案的屬性了。但是,我們是否有考慮過這樣一個問題,當建立一個新的檔案或者目錄時,它的預設許可權是什麼?


這就要跟現在所講解的umask命令扯上關係了。通常,umask就是指定 "目前使用者在建立檔案或目錄時候的許可權預設值".那麼我們如何設定umask呢?首先我們來檢視一下我們系統裡預設的umask是什麼樣的


[root@xiaoluo home]# umask

0022

[root@xiaoluo home]# umask -S

u=rwx,g=rx,o=rx

檢視方式有兩種,一種可以直接輸入 umask ,就可以看到數字型態的許可權配置分數, 一種則是加入 -S (Symbolic) 這個選項,就會以符號型別的方式來顯示出許可權了! 這裡顯示的 umask 有四組數字, 第一組是特殊許可權用的,我們先不要理他,先看後面三組數字。

在預設許可權的屬性上,目錄與檔案是不一樣的。由於我們不希望檔案具有可執行的許可權,預設情況下,檔案是沒有可執行(x)許可權的。因此:


若使用者建立為 檔案 則預設【沒有可執行( x )許可權】,亦即只有 rw 這兩個許可權,也就是最大為 666 分,預設許可權如下: -rw-rw-rw-

若使用者建立為 目錄 ,則由於 x 與是否可以進入此目錄有關,因此預設為所有許可權均開放,亦即為 777 分,預設許可權如下: drwxrwxrwx

umask 指定的是【該預設值需要減掉的許可權!】因為 r、w、x 分別是 4、2、1 ,也就是說,當要拿掉能寫的許可權,就是輸入 2 分,而如果要拿掉能讀的許可權,也就是 4 分,那麼要拿掉讀與寫的許可權,也就是 6 分,而要拿掉執行與寫入的許可權,也就是 3 分,如果我拿掉5 分的話,那就是拿掉讀與執行的許可權啦!如果以上面的例子來說明的話,因為 umask 為 022 ,所以 user 並沒有被拿掉屬性,不過 group 與 others 的屬性被拿掉了 2 ( 也就是 w 這個屬性 ),那麼由於當使用者:


建立檔案時:(-rw-rw-rw-) – (-----w--w-) ==> -rw-r--r--

建立目錄時:(drwxrwxrwx) – (d----w--w-) ==> drwxr-xr-x

我們可以透過例項來看一下:



[root@xiaoluo home]# umask

0022

[root@xiaoluo home]# touch test1

[root@xiaoluo home]# mkdir test2

[root@xiaoluo home]# ls -

-rw-r--r--.  1 root    root            0 4月  25 22:29 test1

drwxr-xr-x.  2 root    root         4096 4月  25 22:29 test2


所以,umask與檔案和目錄的預設許可權是有很大關係的。如果我們希望編寫的檔案具有的許可權是 -rw-rw-r-- 許可權,則此時應該將umask改成 002 才對。例如如下例子:


[root@xiaoluo home]# umask 002  // 這樣檔案的預設許可權就是預設 其他組許可權拿掉 可讀r許可權

[root@xiaoluo home]# touch test3

[root@xiaoluo home]# mkdir test4

-rw-rw-r--.  1 root    root            0 4月  25 22:37 test3

drwxrwxr-x.  2 root    root         4096 4月  25 22:37 test4

在預設的情況中, root 的 umask 會拿掉比較多的屬性,root 的 umask 預設是 022 , 這是基於安全的考量。至於一般身份使用者,通常他們的 umask 為 002 ,亦即保留同群組的寫入權力! 關於預設 umask 的配置可以參考 /etc/bashrc 這個檔案的內容,不過,不建議修改該檔案。


二、檔案隱藏屬性


我們透過 ls -l 命令來檢視檔案的資訊時,一般列出來的檔案屬性只有9個,但是檔案是有隱藏屬性的,隱藏屬性對系統有很大的幫助,尤其是系統安全性方面,非常的重要。


1.chattr (設定檔案隱藏屬性)



[root@xiaoluo ~]# chattr [+-=][ASacdistu] 檔案或目錄名稱

引數:

+   :增加某一個特殊引數,其他原本存在引數則不動。

-   :移除某一個特殊引數,其他原本存在引數則不動。

=   :設定一定,且僅有後面接的引數


A  :當設定了 A 這個屬性時,這個檔案(或目錄)的訪問時間 atime (access)

    將不可被修改,可避免例如手提式計算機容易有磁碟 I/O 錯誤的情況發生!

S  :這個功能有點類似 sync 的功能!就是會將資料同步寫入磁碟當中!

    可以有效的避免資料流失!

a  :當設定 a 之後,這個檔案將只能增加資料,而不能刪除,只有 root

    才能設定這個屬性。

c  :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,

    但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)

d  :當dump(備份)程式被執行的時候,設定 d 屬性將可使該檔案(或目錄)不具有dump功能

i  :這個 i 可就很厲害了!他可以讓一個檔案【不能被刪除、改名、設定連結也無法寫入

    或新增資料!】對於系統安全性有相當大的幫助!

j  :當使用 ext3 這個檔案系統格式時,設定 j 屬性將會使檔案在寫入時先記錄在

    journal 中!但是當 filesystem 設定引數為 data=journalled 時,由於已經設定了

    日誌了,所以這個屬性無效!

s  :當檔案設定了 s 引數時,他將會被完全的移除出這個硬碟空間。

u  :與 s 相反的,當使用 u 來配置檔案案時,則資料內容其實還存在磁碟中,

    可以使用來 undeletion.

注意:這個屬性設定上面,比較常見的是 a 與 i 的設定值,而且很多設定值必須要身為

root 才能夠設定的!

範例:

[root@xiaoluo home]# touch attrtest

[root@xiaoluo home]# chattr +i attrtest

[root@xiaoluo home]# rm attrtest

rm:是否刪除普通空檔案 "attrtest"?y

rm: 無法刪除"attrtest": 不允許的操作

# 只要給該檔案加上了-i這個屬性後,連 root 也沒有辦法將這個檔案刪除!

[root@xiaoluo home]# chattr -i attrtest


這個命令是很重要的,尤其是在系統的資料安全上面!由於這些屬性是隱藏的性質,所以需要以 lsattr 命令 才能看到該屬性!其中,最重要的當屬 +i 與 +a 這個屬性了。+i 可以讓一個檔案無法被更改,對於需要強烈的系統安全的人來說, 這兩個屬性是最重要的!


2. lsattr (顯示檔案的隱藏屬性)



[root@xiaoluo ~]# lsattr [-adR] 檔案或目錄

選項與引數:

-a :將隱藏檔案的屬性也lie出來;

-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;

-R :連同子目錄的資料也一併列出來!


[root@xiaoluo home]# chattr +aij attrtest

[root@xiaoluo home]# lsattr attrtest      

----ia---j---e- attrtest


使用chattr設定了檔案的隱藏屬性後,我們可以透過lsattr這個命令來檢視該檔案的隱藏屬性。


三、檔案特殊許可權:  SUID/SGID/Sticky Bit


在之前一直提到的檔案的重要許可權時,就是rwx這三個讀、寫、執行的許可權。但是,我們可以看一下/tmp 以及 /usr/bin/passwd 的許可權:


[root@xiaoluo home]# ls -ld /tmp; ls -l /usr/bin/passwd

drwxrwxrwt. 42 root root 4096 4月  25 21:48 /tmp

-rwsr-xr-x. 1 root root 30768 2月  22 2012 /usr/bin/passwd

在這裡我們可以看到,在/tmp的許可權中多出了一個t許可權,/usr/bin/passwd 的許可權裡多了一個s許可權,這是什麼原因呢?這就是跟馬上要講解的 SUID/SGID/Sticky Bit 扯上關係了。


1.SUID (Set UID)


會建立出 s 與 t 的許可權,是為了讓一般使用者在執行某些程式的時候, 能夠暫時的具有該程式擁有者的許可權。 舉例來說,我們知道賬號與密碼的存放檔案其實是 /etc/passwd 與 /etc/shadow 。 而 /etc/shadow 這個檔案的許可權是什麼呢?


[root@xiaoluo home]# ls -l /etc/shadow

----------. 1 root root 1407 4月   6 14:05 /etc/shadow

是『----------』。且他的擁有者是 root !在這個許可權中,僅有 root 可以強制儲存,其他人是連看都沒有辦法看!


但是偏偏我們使用 xiaoluo 這個一般身份使用者去更新自己的密碼時,使用的就是 /usr/bin/passwd 這個程式, 卻是可以更新自己的密碼的,也就是說, xiaoluo 這個一般身份使用者可以存取 /etc/shadow 這個密碼檔案! 但是我們也可以看到,明明 /etc/shadow 就是沒有 xiaoluo 可以存取的許可權!所以這就是 s 這個許可權的用處了! 當 s 這個許可權在 user 的 x 時,也就是類似上表的 -r-s--x--x ,稱為 Set UID ,簡稱為 SUID , 這個 UID 代表的是 User 的 ID ,而 User 代表的則是這個程式 (/usr/bin/passwd) 的擁有者 (當然就是root了 !)。 那麼由上面的定義中,我們知道了,當 xiaoluo 這個使用者執行 /usr/bin/passwd 時,他就會 暫時 的得到檔案擁有人 root 的許可權。


SUID 僅可用在【二進位制制檔案(binary file)】上, SUID 因為是程式在執行的過程中擁有檔案擁有者的許可權,因此,他僅可用於 binary file , 不能夠用在批處理檔案 (shell script) 上面的!這是因為 shell script 只是將很多的 binary 執行檔叫進來執行而已!所以 SUID 的許可權部分,還是得要看 shell script 呼叫進來的程式的設定, 而不是 shell script 本身。當然,SUID 對於目錄也是無效的,這點要特別留意。所以總結一點:SUID是隻能作用在檔案上的,不能作用在目錄上。


2.SGID (Set GID)


進一步來說,如果 s 的許可權是在 group 時,那麼就是 Set GID ,簡稱為 SGID。SGID可以用在兩個方面上:


檔案:如果 SGID 是設定在 binary file 上面,則不論使用者是誰,在執行該程式的時候, 他的有效群組 (effective group) 將會變成該程式的群組所有人 (group id)。

目錄:如果 SGID 是設定在 A 目錄上面,則在該 A 目錄內所建立的檔案或目錄的 group ,將會是 此 A 目錄的 group !

一般來說,SGID多用在特定的多人團隊的專案開發商,在系統中用得較少。


3.Sticky Bit


Sticky Bit 目前只針對目錄有效,對於檔案已經沒有效果了。 SBit 對於目錄的作用是:【在具有 SBit 的目錄下,使用者若在該目錄下具有 w 及 x 的許可權, 則當使用者在該目錄下建立檔案或目錄時,只有檔案擁有者與 root 才有權力刪除】。換句話說:當甲這個使用者於 A 目錄下是擁有 group 或者是 other 的專案,並且擁有 w 的許可權, 這表示【甲使用者對該目錄內任何人建立的目錄或檔案均可進行 "刪除/更名/移動" 等動作。】 不過,如果將 A 目錄加上了 Sticky bit 的許可權專案時, 則甲只能夠針對自己建立的檔案或目錄進行刪除/更名/移動等動作。

舉例來說,我們的 /tmp 本身的許可權是『drwxrwxrwt』, 在這樣的許可權內容下,任何人都可以在 /tmp 內新增、修改檔案,但僅有該檔案/目錄建立者與 root 能夠刪除自己的目錄或檔案。這個特性非常重要!


4. SUID/SGID/SBIT 許可權設定


上面介紹了SUID與SGID的功能,那麼,如何開啟檔案使其成為具有SUID與SGID的許可權呢?這就需要使用數字的那種方式來更改許可權了。我們修改檔案的rwx屬性用的是3個數字,所以如果我們需要使檔案具有SUID或者SGID的許可權,這時就要用到4組數字,即在rwx的3組數字前面加上一個數字就行了。


4 為 SUID

2 為 SGID

1 為 Sticky bit

假設我們要將一個檔案屬性改為 "-rwsr-xr-x",由於s在使用者許可權中,所以是SUID,因此,我們修改該檔案的許可權命令應該要寫成 【chmod 4755 filename】。我們透過一些例項來看一下:(注意:【SUID不是用在目錄上,SBIT不是用在檔案上】)




[root@xiaoluo home]# touch test

[root@xiaoluo home]# chmod 4755 test; ls -l test

-rwsr-xr-x. 1 root root 0 4月  25 23:16 test

[root@xiaoluo home]# chmod 6755 test; ls -l test

-rwsr-sr-x. 1 root root 0 4月  25 23:16 test

[root@xiaoluo home]# chmod 1755 test; ls -l test

-rwxr-xr-t. 1 root root 0 4月  25 23:16 test


[root@xiaoluo home]# chmod 7666 test; ls -l test

-rwSrwSrwT. 1 root root 0 4月  25 23:16 test

# 這個例子就要注意一下了!怎麼會出現大寫的 S 與 T 呢?不都是小寫的嗎?

# 因為 s 與 t 都是取代 x 這個引數的,但是我們這裡修改許可權的數字是

# 7666 !也就是說, user, group 以及 others 都沒有 x 這個可執行的標誌

# 所以,這個 S, T 代表的就是【空的】!

# SUID 是表示【該檔案在執行的時候,具有檔案擁有者的許可權】,但是檔案

# 擁有者都無法執行了,哪裡來的許可權給其他人使用?所以這裡當然就是空的!s、t都用大寫表示S、T


4.檔案型別 file

如果我們想知道某個檔案的基本資訊,例如,是屬於 ASCII 或者是 data 檔案,或者是 binary , 且其中有沒有使用到動態函式庫 (share library) 等等的資訊,就可以利用 file 這個命令來檢視!



[root@xiaoluo home]# file ~/.bashrc

/root/.bashrc: ASCII text  -->> 這是ASCII 檔案  

[root@xiaoluo home]# file /usr/bin/passwd

/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),

for GNU/Linux 2.6.18, stripped


透過這個命令,我們就能先簡單判定檔案的格式了。


三、搜尋檔案


搜尋檔案功能是每個作業系統所必須具備的一個功能,因為我們通常需要知道某個檔案放在哪裡。在Linux系統中,也有相當優秀的搜尋系統,最熟悉的應該就是 find 命令了,但是通常情況下find並不怎麼常用,因為其速度非常緩慢,耗費硬碟空間。通常我們先使用 whereis 或者是 locate 命令先來搜尋,如果真的找不到了,才以find來進行搜尋。因為whereis和locate 命令是使用資料庫來搜尋資料,而且並沒有實際搜尋硬碟,所以速度相當的快,比較省時。


1.which (尋找"執行檔案")



[root@xiaoluo ~]# which [-a] command

引數:

-a :將所有可以找到的指令均列出,而不止第一個被找到的指令名稱


[root@xiaoluo ~]# which passwd  -->> 列出第一個找到的可執行檔案

/usr/bin/passwd    


[root@xiaoluo ~]# which -a tracepath   -->> 列出所有找到的同名可執行檔案

/bin/tracepath

/usr/sbin/tracepath


這個指令是根據【PATH】這個環境變數所規範的路徑,去搜尋【執行檔案】的檔名。所以,重點是找出【執行檔案】而已!且 which 後面接的是要是 完整的檔名字 !若加上 -a 引數,則可以列出所有的可以找到的同名執行檔案,而非僅顯示第一個而已!


2.whereis (尋找特定檔案)



[root@xiaoluo ~]# whereis [-bmsu] 檔名或目錄名

引數:

-b    :只找 binary 的檔案

-m    :只找在說明檔案 manual 路徑下的檔案

-s    :只找 source 來原始檔

-u    :沒有說明檔案的檔案!


[root@xiaoluo ~]# whereis passwd

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

# 任何與 passwd 有關的檔名都會被列出來


[root@xiaoluo ~]# whereis -b passwd

passwd: /usr/bin/passwd /etc/passwd


[root@xiaoluo ~]# whereis -m passwd

passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz


等一下我們會介紹 find 這個搜尋指令, find 是很強大的搜尋指令,但時間花用的很大! (因為 find 是直接搜尋硬碟,會花費比較多的時間)這個時候 whereis 就相當的好用了!另外, whereis 可以加入引數來找尋相關的資料, 例如如果你是要找可執行檔案 ( binary ) 那麼加上 -b 就可以了!例如上面的例項如果不加任何引數的話,那麼就將所有的passwd資料列出來!

為什麼 whereis 命令能搜尋的這麼快呢?這是因為 Linux 系統會將系統內的所有檔案都記錄在一個資料庫檔案裡面, 而當使用 whereis 或者是 locate 時,都會以此資料庫檔案的內容為準, 因此,有的時後你還會發現使用這兩個執行檔案時,會找到已經被刪掉的檔案, 而且也找不到最新的剛剛建立的檔案! 這就是因為這兩個命令是由資料庫當中的結果去搜尋檔案。


3.locate (尋找特定檔案)



[root@xiaoluo ~]# locate filename

[root@xiaoluo ~]# locate passwd

/etc/passwd

/etc/passwd-

/etc/dovecot/conf.d/auth-passwdfile.conf.ext

/etc/pam.d/passwd

/etc/samba/smbpasswd

/etc/security/opasswd

/etc/sysconfig/ha/web/secure/passwd.php

/lib64/security/pam_passwdqc.so

/lib64/security/pam_unix_passwd.so

/usr/bin/RSA_SecurID_getpasswd

...............此處省略N個字!!!!!!.................


locate的使用比whereis更簡單,直接在後面輸入 "檔案的部分名稱" 後,就能得到結果了。例如我們這個例子輸入的是 locate passwd,那麼,在完整的檔名(包含路徑名稱)中,只要其中有passwd,就會被搜尋顯示出來。如果忘記了某個檔案的完整檔名時,這是以惡很方便好用的命令。

locate來搜尋檔案也非常的快,這是因為locate與whereis命令一樣都是從資料庫中去搜尋檔案,所以比find命令直接去硬碟裡搜尋速度要快的多。


4.find



[root@xiaoluo ~]# find [PATH] [option] [action]

引數:

1. 與時間有關的引數:

  -atime n :n 為數字,意義為在 n 天之前的『一天之內』被 access 過的檔案;

  -ctime n :n 為數字,意義為在 n 天之前的『一天之內』被 change 過狀態的檔案;

  -mtime n :n 為數字,意義為在 n 天之前的『一天之內』被 modification 過的檔案;

  -newer file :file 為一個存在的檔案,意思是說,只要檔案比 file 還要新,

                就會被搜尋出來2. 與使用者或組名有關的引數:

  -uid n :n 為數字,這個數字是使用者的賬號 ID,亦即 UID ,這個 UID 是記錄在

           /etc/passwd 裡面與賬號名稱對應的數字。這方面我們會在第四篇介紹。

  -gid n :n 為數字,這個數字是組名的 ID,亦即 GID,這個 GID 記錄在

           /etc/group,

  -user name :name 為使用者賬號名稱!例如 dmtsai

  -group name:name 為組名,例如 users ;

  -nouser    :尋找檔案的擁有者不存在 /etc/passwd 的人!

  -nogroup   :尋找檔案的擁有群組不存在於 /etc/group 的檔案!

               當您自行安裝軟體時,很可能該軟體的屬性當中並沒有檔案擁有者,

               這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。

3. 與檔案許可權及名稱有關的引數:

  -name filename:搜尋檔名為 filename 的檔案;

  -size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的檔案。這個 SIZE 的規格有:

                  c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB

                  還要大的檔案,就是『 -size +50k 』

  -type TYPE    :搜尋檔案的型別為 TYPE 的,型別主要有:一般正規檔案 (f),

                  裝置檔案 (b, c), 目錄 (d), 連結檔案 (l), socket (s),

                  及 FIFO (p) 等屬性。

  -perm mode  :搜尋檔案屬性『剛好等於』 mode 的檔案,這個 mode 為類似 chmod

                的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 !

  -perm -mode :搜尋檔案屬性【必須要全部囊括 mode 的屬性】的檔案,舉例來說,

                我們要搜尋 -rwxr--r-- ,亦即 0744 的檔案,使用 -perm -0744,

                當一個檔案的屬性為 -rwsr-xr-x ,亦即 4755 時,也會被列出來,

                因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。

  -perm +mode :搜尋檔案屬性【包含任一 mode 的屬性】的檔案,舉例來說,我們搜尋

                -rwxr-xr-x ,亦即 -perm +755 時,但一個檔案屬性為 -rw-------

                也會被列出來,因為他有 -rw.... 的屬性存在!

4. 額外可進行的動作:

  -exec command :command 為其他指令,-exec 後面可再接額外的指令來處理搜尋到

                  的結果。

  -print        :將結果列印到螢幕上,這個動作是預設動作!


例項一:將過去系統上面 24 小時內有改變過內容 (mtime) 的檔案列出

[root@xiaoluo ~]# find / -mtime 0

# 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前,

# 有變動過內容的檔案都會被列出來!那如果是三天前的 24 小時內?

# find / -mtime 3 ,意思是說今天之前的 3*24 ~ 4*24 小時之間

# 有變動過的檔案都被列出的意思!同時 -atime 與 -ctime 的用法相同。


我們現在知道 atime, ctime 不 mtime 的意義,如果你想要找出一天內被更改過的癿檔名, 可以使用上述例項一的作法。但如果我想要找出 (4 天內被更改過的檔名)呢?那

可以使用【find /var -mtime -4 】。那如果是【4 天前的那一天】就用【 find /var -mtime 4 】。有沒有加上【+, -】差別非常的大!我們可以用簡單的圖來表示一下:




圖中最右邊為目前的時間,越往左邊則代表越早之前的時間軸。由圖 我們可以清楚的知道:


+4 代表大於等於 5 天前的檔名:ex> find /var -mtime +4

-4 代表小於等於 4 天內的檔名:ex> find /var -mtime -4

4 則是代表 4-5 那一天的檔名名:ex> find /var -mtime 4


例項二:尋找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出

[root@xialuo ~]# find /etc -newer /etc/passwd

# -newer 用在分辨兩個檔案之間的新舊關係是很有用的!


例項三:搜尋 /home 底下屬於 xiaoluo 的檔案

[root@xiaoluo ~]# find /home -user xiaoluo

# 當我們要找出任何一個使用者在系統當中的所有檔案時,

# 就可以利用這個指令將屬於某個使用者的所有檔案都找出來!


例項四:搜尋系統中不屬於任何人的檔案

[root@xiaoluo ~]# find / -nouser

# 透過這個命令,可以輕易的就找出那些不太正常的檔案。


例項五:找出檔名為 passwd 這個檔案

[root@xiaoluo ~]# find / -name passwd

# 利用這個 -name 可以搜尋檔名!


例項六:搜尋檔案屬性為 f (一般檔案) 的檔案

[root@xiaoluo ~]# find /home -type f

# 這個 -type 的屬性也很有用!尤其是要找出那些怪異的檔案,

# 例如 socket 與 FIFO 檔案,可以用 find /var -type p 或 -type s 來找!


例項七:搜尋檔案當中含有 SGID/SUID/SBIT 的屬性

[root@xiaoluo ~]# find / -perm +7000

# 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出,

# 所以當然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三個許可權,


例項八:將上個範例找到的檔案使用 ls -l 列出來

[root@xiaoluo ~]# find / -perm +7000 -exec ls -l {} \;

# 注意到,那個 -exec 後面的 ls -l 就是額外的指令,

# 而那個 {} 代表的是【由 find 找到的內容】的意思~所以, -exec ls -l {}

# 就是將前面找到的那些檔案以 ls -l 列出長的資料!至於 \; 則是表示

# -exec 的指令到此為止的意思。 意思是說,整個指令其實只有在

# -exec (裡面就是指令下達) \;

# 也就是說,-exec 最後一定要以 \; 結束才行!


例項九:找出系統中,大於 1MB 的檔案

[root@xiaoluo ~]# find / -size +1000k


如果要查詢一個檔案,使用find命令是一個很不錯的選擇, 它可以根據不同的引數來給予檔案的搜尋功能!例如你要尋找一個檔名為 httpd.conf 的檔案,你知道它應該是在 /etc 底下,那麼就可以使用『 find /etc -name httpd.conf 』! 那如果你記得有一個檔名包含了 httpd ,但是不知道全名怎辦?!那就用萬用字元 *  吧,如上以:【 find /etc -name '*httpd*' 】就可將檔名含有 httpd 的檔案都列出來!不過,由於 find 在尋找資料的時後相當的耗硬碟!所以一般我們首先透過whereis 或者 locate命令來進行搜尋。


相關文章