04. Linux文件與目錄管理

1. 幾個特殊目錄

. :此層目錄
.. :上一層目錄
-:前一個工作目錄
~:當前用戶的家目錄
~account:account用戶的家目錄

說明:每個目錄下都有. 和..目錄,即使是根目錄/ 下也有,只不過他們代表同一個目錄(可以發現根目錄下的. 和.. 目錄的inode編號相同,爲同一個目錄)

一般文件系統的頂層目錄(如本例中的/、/boot、/home)的inode編號從2開始,幾個編號爲1的目錄都是虛擬文件系統的頂層目錄
所謂的頂層目錄,實際上就是文件系統在目錄樹中的掛載點

2. PATH環境變量

1)在任何地方都可以執行PATH環境變量中所包含目錄中的命令

2)不同用戶的PATH環境變量值是不同的,所以能隨意執行的命令也不同。
3)假設2個ls命令在不同的目錄中,如/usr/local/bin/ls和/bin/ls,那麼執行ls時,PATH中哪個目錄先被搜索就執行哪個。

4)PATH環境變量可以修改
① shell中使用export PATH=$PATH:要加入的目錄,實現臨時修改
② 在腳本中修改(~/.bashrc等),實現永久修改

注意:出於安全因素考慮,最好不要將當前目錄( . )加入PATH變量

3. 目錄與文件相關命令

1)cd命令

命令名稱:cd
命令英文原意:change directory
命令所在路徑:shell內建命令
執行權限:所有用戶
功能描述:切換工作目錄
語法:cd [目錄]
注:cd後不加任何內容是進入當前用戶的家目錄

2)pwd命令

命令名稱:pwd
命令英文原意:print working directory
命令所在路徑:/bin/pwd
執行權限:所有用戶
功能描述:顯示當前目錄
語法:pwd [-P]
-P:如果當前目錄是軟連接,則顯示其指向的目錄(avoid all symlinks)
示例:


3)mkdir命令

命令名稱:mkdir
命令英文原意:make directories
命令所在路徑:/bin/mkdir
執行權限:所有用戶
功能描述:創建新目錄
語法:mkdir [-pm] 目錄名
-p:遞歸創建,一併創建路徑中尚未創建的目錄,如果目錄已存在不報錯
-m:創建目錄的同時指定權限,無視默認權限(umask)


4)rmdir命令

命令名稱:rmdir
命令英文原意:remove empty directories
命令所在路徑:/bin/rmdir
執行權限:所有用戶
功能描述:刪除空目錄
語法:rmdir [-p] 目錄名
-p:連同上層的 空目錄 一併刪除

5)ls命令

命令名稱:ls
命令所在路徑:/bin/ls
執行權限:所有用戶
功能描述:顯示目錄文件
語法:ls [-aldhiR] [文件或目錄]
-a:顯示所有文件,包括隱藏文件
-l:詳細信息顯示
-d:查看目錄屬性
-h:人性化顯示
-i:顯示inode編號
-R:連同子目錄內容一併顯示,即顯示目錄下的所有文件
說明:-d 選項作用

6)cp命令

命令名稱:cp
命令英文原意:copy
命令所在路徑:/bin/cp
執行權限:所有用戶
功能描述:複製文件或目錄
語法:cp [-rpdu] 源文件或目錄 目標目錄
-r:遞歸,複製目錄時必須使用
-p:複製時保留文件屬性(常用於備份)
-d:若源文件爲軟鏈接文件,則複製鏈接文件屬性而非文件本身
-u:只有目標比源舊時才複製(update)
-a:相當於-pdr

注意:理解cp命令的關鍵是cp的目標文件是 新建一個文件 ,因此會使用新的inode和block,自然也就有了拷貝中的權限屬性問題。

所謂權限屬性問題,即如果在拷貝中不加限制,目標文件的屬性將會是用戶新建文件的默認屬性(這些屬性包括文件所有者、所屬組、權限、時間等)。

說明1:-p 選項的作用
可見,當沒有使用-p 選項時,由於複製文件相當於在目標目錄中新建文件,所以文件的最後修改時間就改變了。

在默認條件下,cp的源文件與目的文件的權限不同,目的文件的所有者通常是命令操作者本身(即新建文件時的默認所有者和所屬組),此時也可以使用-p選項保留原用戶和原用戶組

可見使用-p選項後保留了原先的用戶組信息,但是 只有root用戶有此功能,普通用戶即使使用-p 選項也無法保留文件所有者和所屬組
普通用戶使用-p 選項可以保持時間不變,但用戶和用戶組均改爲cp命令執行者及其缺省組

爲什麼會這樣呢?其實從root環境的例子中就可以找到答案,我們觀察複製後文件的inode編號
一定要注意,複製後的文件是一個獨立的文件,root用戶使用-p的做法相當於給utmp用戶組增加了一個文件,但普通用戶是沒有這個權利的

說明2:-d選項的作用
假設hello_soft是hello的軟鏈接文件

下面測試-d 選項的作用

說明3:使用cp複製文件需要有文件的讀權限(當然僅是針對普通用戶而言)

說明4:cp 命令還可以進行硬鏈接[-l]和軟鏈接[-s],但我個人強烈反對這種非主流的用法

7)rm命令

命令名稱:rm
命令英文原意:remove
命令所在路徑:/bin/rm
執行權限:所有用戶
功能描述:刪除文件或目錄
語法:rm [-rf] 文件或目錄
-r:遞歸,刪除目錄時必須使用
-f:強制執行
注意:root用戶使用的rm實際上是rm -i的別名,所以刪除文件時默認會有提示

8)mv命令

命令名稱:mv
命令英文原意:move
命令所在路徑:/bin/mv
執行權限:所有用戶
功能描述:剪切文件、改名
語法:mv 源文件或目錄 目標目錄
注:也可以使用rename命令給文件更名,而且可以實現批量更改

注意1:剪切並不會新建文件,只是修改目錄文件block中文件名與inode的對應關係

注意2:root用戶的mv命令也是別名

9)touch命令

命令名稱:touch
命令所在路徑:/bin/touch
執行權限:所有用戶
功能描述:創建空文件,更新文件的時間戳
語法:touch 文件名
說明:關於更新文件時間戳

只有文件是所有者和root可以修改文件的時間戳
經上機驗證,普通用戶如果是文件所有者,即使沒有r、w、x權限依然可以使用touch修改時間戳。這是因爲時間戳記錄在文件對應的inode中而不是文件本身的內容,而所謂文件的權限是針對文件內容的。

Linux中文件的三個時間:
① modification time(mtime)
當文件的「內容數據」更改時(block被修改),就會更新這個時間,ls默認顯示的時間就是mtime。

② status time(ctime, change time)
當文件的「狀態」改變時(inode被修改),就會更新這個時間,比如 權限 屬性 被更改。
③ access time(atime)
當「該文件的內容被取用」時,就會更新這個時間,比如使用cat去顯示文件的內容

touch命令更新的是atime和mtime(update the access and modification times of each file to the current time)

10)取得文件名與目錄名

basename:取得文件名
dirname:取得目錄名


11)file命令

命令名稱:file
命令所在路徑:/usr/bin/file
執行權限:所有用戶
功能描述:查看文件類型
語法:file 文件名

4. 文件內容查閱命令

1)cat命令

命令名稱:cat
命令所在路徑:/bin/cat
執行權限:所有用戶
功能描述:顯示文件內容;連接文件並顯示在標準輸出上
語法:cat [-n] 文件名
-n:顯示行號,連空白行也有行號

2)tac命令

命令名稱:tac
命令所在路徑:/usr/bin/tac
執行權限:所有用戶
功能描述:反向顯示文件內容
語法:tac 文件名
注意:tac是沒有-n選項的~~

3)more命令

命令名稱:more
命令所在路徑:/bin/more
執行權限:所有用戶
功能描述: 分頁 顯示文件內容
語法:more 文件名
相關操作:
[空格]或[f]:向下翻頁
[Enter]:換行
[b]:向上翻頁 //原來只有less可以
q或Q:退出
但more中不能查找(準確說是不能標亮)

4)less命令

命令名稱:less
命令所在路徑:/usr/bin/less
執行權限:所有用戶
功能描述:分頁顯示內容,可向上翻頁(可以使用PgUp、PgDn和上下箭頭),也可以查找
語法:less 文件名

5)head命令

命令名稱:head
命令所在路徑:/usr/bin/head
執行權限:所有用戶
功能描述:顯示文件前面幾行
語法:head [-n] 文件名 //head -n 5 filename
-n:指定顯示的行數,默認爲10行
說明:head -n -100 filename
-n 後的參數爲負數:除了最後的100行不顯示,其餘均顯示出來

6)tail命令

命令名稱:tail
命令所在路徑:/usr/bin/tail
執行權限:所有用戶
功能描述:顯示文件後面幾行
語法:tail [-nf] 文件名
-n:指定顯示的行數,默認爲10行
-f:動態顯示文件末尾內容

說明1:tail -n +100 filename
從100行開始,顯示到最後(-n +K,to output lines starting with the Kth)
說明2:-f 選項的作用
以日誌文件/var/log/message爲例
可見顯示後並沒有退出,而是掛起等待,下面用SecureCRT遠程登錄,然後設置一下虛擬IP
這些操作就會反應到日誌文件中。該功能一般用於動態監視日誌文件。

7)od命令

命令名稱:od
命令所在路徑:/usr/bin/od
執行權限:所有用戶
功能描述:使用八\十六進制或其他格式顯示文件,一般用於顯示非文本文件
語法:od [-t TYPE] [文件名] //此處可以省略文件名,此時從stdin得到輸入內容
-t c:以ASCII字符輸出
-t d[size]:利用十進制輸出,每個整數佔用size個字節
-t o[size]:利用八進制輸出,每個整數佔用size個字節
-t x[size]:利用十六進制輸出,每個整數佔用size個字節
注意:size只能是2的n次冪

注:如果不用-t 選擇指定,默認是以-t o2顯示文件內容

5. 文件特殊權限:SUID、SGID、SBIT

1)概述

這三種特殊權限都是針對文件的執行(x)權限,通過替換user、group和other的x權限位實現不同的功能
說明:s 與t 這兩個權限的意義與系統的賬號及系統的進程有關

2)SUID(Set UID)

定義:s 出現在文件所有者的x 權限上
功能:
只有 可執行的二進制程序才能設定SUID權限
② 命令的執行者要對該程序有x 權限
③ 命令執行者在執行該程序時獲得該程序文件屬主的身份
④ SUID權限只在該程序執行過程中有效,也就是說身份改變只在程序執行過程中有效。

示例:passwd命令
普通用戶可以通過passwd命令修改自己的密碼,而對密碼的修改就體現在對/etc/shadow文件的修改,我們來看一下這個文件的權限
也就是說,只有root用戶可以讀寫這個文件(因爲rwx權限是不能限制root用戶的)

下面再看一下passwd命令的權限
可見passwd命令設置了SUID,所以普通用戶在執行passwd命令時獲得了passwd命令屬主,即root用戶的身份,因而可以修改/etc/passwd文件
特別注意 :SUID的設置是非常危險的,假設vim被設置了SUID,那麼所有能運行vim的用戶都可以藉由vim這個軟件修改系統文件。因此在Linux中將這類文件標爲紅色,以示危險。

3)SGID(Set GID)

定義:s 出現在文件所屬組的x 權限上
SGID 對文件 的作用:
① 只有可執行的二進制程序能設置SGID權限
② 命令執行者要對該程序擁有x權限
③ 命令執行者在執行程序時,組身份提升爲該程序文件的屬組
④ SGID權限同樣只在該程序執行過程中有效,也就是說組身份的改變只在程序執行過程中有效
SGID對文件作用示例:locate命令
locate命令在執行過程中要查詢/var/lib/mlocate/mlocate.db,我們來看看這個數據庫的權限
注意:這個數據庫原先沒有,在執行了 updatedb 後纔有
可見普通用戶並不能訪問這個數據庫文件,下面再來看看locate命令的權限

可見該命令設置的SGID,所以普通用戶在運行locate命令時,組身份變爲slocate,因此可以讀取mlocate.db數據庫

SGID對目錄的作用:
① 普通用戶必須對此目錄擁有r 和x 權限,才能進入此目錄
② 普通用戶在此目錄中的 有效組 會變成此目錄的屬組
③ 若普通用戶對此目錄擁有w 權限,新建文件的默認屬組是這個目錄的屬組
注意:如果沒有SGID,新建文件的屬組應該是命令執行者的缺省組

說明:有效組的查看
可以使用id命令查看當前有效組
id:print real and effective user and group IDs

但是根據實驗,在設置SGID的目錄中,使用id打印出的有效組依然爲500。但創建文件的所屬組確實更改爲該目錄的所屬組

4)SBIT(Sticky Bit)

定義:t 出現在文件其他用戶的x 權限上
功能:
① SBIT目前只對目錄有效
② 普通用戶對該目錄擁有w 和x 權限,即普通用戶可以在此目錄擁有寫入權限
③ 如果沒有SBIT,因爲普通用戶擁有w 權限,所以可以刪除此目錄下的所有文件,包括其他用戶建立的文件。一旦賦予了SBIT,除了root可以刪除所有文件,普通用戶就算擁有w 權限,也只能刪除自己建立的文件,但是不能刪除其他用戶建立的文件

示例:/tmp目錄
所以任何人都可以在/tmp內添加、修改文件,但僅有該文件/目錄的屬主和root能刪除。

5)如何設置特殊權限位

chmod xugo 文件/目錄
其中ugo即通常的rwx權限位,x 爲特殊權限位
4:SUID
2:SGID
1:SBIT

注意:由於這三種特殊權限都是針對x 權限的,如果文件本身不具備x 權限,設置後將是S、T,表示空,即沒有相應權限

6. 文件隱藏屬性

1)chattr命令

命令名稱:chattr
命令所在路徑:/nur/bin/chattr
執行權限:所有用戶
功能描述:修改文件/目錄的隱藏屬性
語法:chattr [+-=] [隱藏屬性選項] 文件或目錄名
+:增加權限
-:刪除權限
=:等於某權限

常使用的2種隱藏屬性:
i 屬性:
對文件:不允許對文件進行刪除、改名,也不能添加和修改數據。
對目錄:首先該目錄本身不能刪除、改名。由於目錄文件中記錄的是文件名與inode編號的對應關係,所謂添加、修改目錄文件的數據就是修改目錄下的目錄項。所以添加了i 屬性後,只能修改目錄下文件的數據,但不能建立和刪除目錄下的內容。

a 屬性:
對文件:只能在文件中添加數據,但不能刪除、修改數據。
對目錄:只允許在目錄中建立項目,但不允許刪除項目。

說明:
A. 與一般rwx權限相比, chattr設置的隱藏權限對root用戶也生效 ,但rwx不能。
B. chattr設置的隱藏權限僅對ext2/ext3文件系統有效
C. i 屬性和a 屬性只能由root設置 (已上機驗證)
D. 文件設置a 屬性後,是不能用文本編輯器(如vim)來編輯的,即使我們只是添加內容,因爲系統無法判斷你只是追加內容。可以使用echo xxx >> 文件的方式來追加內容。(從應用編程的角度說,只能以追加的方式打開文件)
E. 這2種隱藏屬性都是保護系統重要文件免遭誤刪除,是實現系統安全的一種手段。

2)lsattr命令

命令名稱:lsattr
命令所在路徑:/usr/bin/ln
執行權限:所有用戶
功能描述:查看文件/目錄的隱藏屬性
語法:lsattr [-adR] 文件/目錄名
-a:顯示所有文件和目錄,包括隱藏文件
-d:若目標是目錄,僅列出目錄本身的屬性,而不是目錄中文件的屬性
-R:連同子目錄的內容全顯示出來

7. 文件查找類命令

1)命令搜索類

A. which命令

命令名稱:which
命令所在路徑:/usr/bin/lwhich
執行權限:所有用戶
功能描述:搜索命令所在路徑及別名信息(show the full path of (shell) command)
語法:which [-a] 命令
-a:列出PATH路徑中所有匹配項,而不只是第一個

說明1:which命令是 根據PATH環境變量 中的路徑去查找 可執行文件
說明2:which後面必須跟 完整的文件名,不能用通配符
說明3:which命令自然查找不到shell內置的命令

B. whereis命令

命令名稱:whereis
命令所在路徑:/usr/bin/whereis
執行權限:所有用戶
功能描述:搜索命令所在目錄及幫助文檔路徑(locate the binary, source, and manual page file for a command)
語法:whereis [-bms] 命令名稱
-b:只查找二進制文件
-m:只查找manual路徑下的文件
-s:只查找源文件

說明1:whereis是搜索文件數據庫,不是搜索硬盤
說明2:wheris也需要 完整的文件名,不能使用通配符

2)文件搜索類

A. locate命令

命令名稱:locate
命令所在路徑:/usr/bin/locate
執行權限:所有用戶
功能描述:在文件資料庫中查找文件
語法:locate [-i] 文件名
-i:忽略大小寫

注意:locate PATTERN的行爲相當於查找文件名爲*PATTERN*的文件,所以加入通配符反而有問題

說明1:locate命令是在/var/lib/mlocate數據庫中搜索文件。
使用數據庫的優點:搜索速度快
使用數據庫的缺點:
① 由於數據庫 不是實時更新 ,所以會找到已刪除的文件,或新創建的文件找不到
② 文件數據庫有 搜索範圍 ,所以有些目錄(比如/tmp目錄)中的文件不會被搜索到

如何更新mlocate數據庫:使用 updatedb 命令,該命令會根據/etc/updatedb.conf的設置去查找系統硬盤內的文件名並更新/var/lib/mlocate數據庫

說明2:locate命令不能使用通配符,但關鍵字可以是要查找文件名的一部分(上文已有解釋)

B. find命令

命令名稱:find
命令所在路徑:/bin/find
執行權限:所有用戶
功能描述:文件搜索(搜索硬盤、最強大、最複雜)
語法:find [搜索範圍(可以接多個目錄)] [匹配條件]
說明:find命令可以使用通配符

下面是對匹配條件的說明:
① 匹配條件
a. 文件名
find /etc -name init //可以使用*init* init*等等
find /etc -iname init //不區分大小寫

b. 文件大小
find / -size +204800
+n:大於n
-n:小於n
n: 等於n
注意:find按文件大小搜索時,以數據塊爲單位,即以512B(0.5KB)爲單位。所以+204800就是搜索大於100MB的文件
也可以使用c(代表byte)或k(代表1024 byte)來指定文件大小(e.g. -size +50k)

c. 文件所有者或所屬組
find / -user chencheng
find / -group chencheng

說明1:也可以使用 -uid -gid 查找
說明2:-nouser和-nogroup分別用於查找文件所有者不在/etc/passwd文件中或文件所屬組不在/etc/group文件中的文件

d. 時間
-amin -cmin -mmin :以分鐘爲單位
-atime -ctime -mtime :以天(24小時)爲單位

下圖顯示的就是使用-mtime +4 -mtime -4 -mtime 4的效果

e. 文件權限
-perm mode:文件權限 = mode
-perm -mode:文件權限 至少 = mode(必須全部包含mode的權限)
-perm +mode:文件權限包含任一mode權限

f. 文件類型
-type f 文件
-type d 目錄
-type l 軟鏈接

g. inode節點編號
-inum

說明:-inum查找的2個應用場景
· 刪除文件名詭異的文件,此時可以根據inode號刪除
find ./ -inum xxx -exec rm {} \;

· 查看一個文件是否有硬鏈接,在文件所在分區按inode編號搜索即可(因爲硬鏈接不能跨分區)
find ./ -inum xxx

② 連接選項
a. 邏輯連接
-a :2個匹配條件同時滿足
-o :2個匹配條件滿足任一即可
比如查找80~100MB的文件
find /etc -size +163840 -a -size -204800
b. find後執行命令
find / -name inittab -exec ls -l {} \; //{}和\;之間的空格必須有
說明:
-exec到\; 標識了額外命令的開始和結束
{}表示find命令的執行結果
可以使用-ok代替-exec,區別在於-ok執行額外命令時,每次都要詢問是否執行
注意:使用-exec執行額外命令不支持命令別名,所以只能用ls -l 而不能使用ll

3)文件內容搜索類

命令名稱:grep
命令所在路徑:/bin/grep
執行權限:所有用戶
功能描述:在文件中搜索與給定字符串匹配的行並輸出
語法:grep [-ivnr] 指定字符串 文件
-i:不區分大小寫
-v:排除指定字符串,輸出剩餘內容
注意:使用-exec執行額外命令不支持命令別名,所以只能用ls -l 而不能使用ll

3)文件內容搜索類

命令名稱:grep
命令所在路徑:/bin/grep
執行權限:所有用戶
功能描述:在文件中搜索與給定字符串匹配的行並輸出
語法:grep [-ivnr] 指定字符串 文件
-i:不區分大小寫
-v:排除指定字符串,輸出剩餘內容
-n:輸出匹配行的行號
-r: 遞歸查找給定目錄下的所有文件,此時命令對象可以是目錄

示例1:grep -n mysql /root/install.log
示例2:不顯示腳本中的註釋(此處指去掉以#開頭的行)
grep -v ^# /etc/inittab
此處的^# 就是指開頭的井號

8. 權限與命令執行的關係

1)讓用戶可以進入某目錄成爲工作目錄的基本權限
可使用的命令:cd
相關文章
相關標籤/搜索