天天看點

「Linux」鳥叔私房菜 第六章讀書筆記

第六章、Linux 檔案與目錄管理

6.1目錄與路徑

6.1.1 相對路徑與絕對路徑

絕對路徑:路徑的寫法『一定由根目錄 / 寫起』,例如: /usr/share/doc 這個目錄。

相對路徑:路徑的寫法『不是由 / 寫起』,例如由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成:『cd ../man』這就是相對路徑的寫法啦!相對路徑意指『相對于目前工作目錄的路徑!』

6.1.2 目錄的相關操作
. 代表此層目錄 .. 代表上一層目錄
- 代表前一個工作目錄
~ 代表『目前使用者身份』所在的家目錄
~account 代表 account 這個使用者的家目錄(account 是個賬号名稱)           

需要特别注意的是:在所有目錄底下都會存在的兩個目錄,分别是『.』與『..』 分别代表此層與上層目錄的意思。目錄的上一層(..)與根目錄自己(.)是同一個目錄。

個常見的處理目錄的指令吧:

cd (change directory, 變換目錄)

沒啥好說的

pwd:顯示目前目錄

Print Working Directory

pwd [-P]
選項與參數:
-P :顯示出确實的路徑,而非使用連結 (link) 路徑。           

mkdir:建立一個新的目錄

[root@study ~]# mkdir [-mp] 目錄名稱
選項與參數:
-m :配置檔案案的權限喔!直接設定,不需要看預設權限 (umask) 的臉色~ -p :幫助你直接将所需要的目錄(包含上層目錄)遞歸建立起來!
範例:請到/tmp 底下嘗試建立數個新目錄看看:
[root@study ~]# cd /tmp
[root@study tmp]# mkdir test <==建立一名為 test 的新目錄 [root@study tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
# 話說,系統告訴我們,沒可能建立這個目錄啊!就是沒有目錄才要建立的!見鬼嘛?
[root@study tmp]# mkdir -p test1/test2/test3/test4
# 原來是要建 test4 上層沒先建 test3 之故!加了這個 -p 的選項,可以自行幫你建立多層目錄!
範例:建立權限為 rwx--x--x 的目錄
[root@study tmp]# mkdir -m 711 test2
[root@study tmp]# ls -ld test*
drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 仔細看上面的權限部分,如果沒有加上 -m 來強制設定屬性,系統會使用預設屬性。 # 那麼你的預設屬性為何?這要透過底下介紹的 umask 才能了解喔! ^_^           

rmdir:删除一個空的目錄

[root@study ~]# rmdir [-p] 目錄名稱 選項與參數:
-p :連同『上層』『空的』目錄也一起删除
範例:将于 mkdir 範例中建立的目錄(/tmp 底下)删除掉! [root@study tmp]# ls -ld test* <==看看有多少目錄存在? drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
[root@study tmp]# rmdir test <==可直接删除掉,沒問題 [root@study tmp]# rmdir test1 <==因為尚有内容,是以無法删除! rmdir: failed to remove ‘test1’: Directory not empty [root@study tmp]# rmdir -p test1/test2/test3/test4
[root@study tmp]# ls -ld test* <==您看看,底下的輸出中 test 與 test1 不見了!
drwx--x--x. 2 root root 6 Jun 4 19:05 test2
# 瞧!利用 -p 這個選項,立刻就可以将 test1/test2/test3/test4 一次删除~ # 不過要注意的是,這個 rmdir 僅能『删除空的目錄』喔!           
6.1.3 關于執行檔案路徑的變量: $PATH
顯示目前的環境變量
echo $PATH           

PATH(一定是大寫)這個變量的内容是由一堆目錄所組成的,每個目錄中間用冒号(:)來隔開, 每個目 錄是有『順序』之分的

加入一個新的環境變量
PATH="${PATH}:/root"           

6.2 檔案與目錄管理

6.2.1 檔案與目錄的檢視: ls
[root@study ~]# ls [--color={never,auto,always}] 檔案名或目錄名稱.. [root@study ~]# ls [--full-time] 檔案名或目錄名稱..
選項與參數:
-a :全部的檔案,連同隐藏檔( 開頭為 . 的檔案) 一起列出來(常用)
-A :全部的檔案,連同隐藏檔,但不包括 . 與 .. 這兩個目錄 -d :僅列出目錄本身,而不是列出目錄内的檔案資料(常用)
-f :直接列出結果,而不進行排序 (ls 預設會以檔名排序!) -F :根據檔案、目錄等資訊,給予附加資料結構,例如:
*:代表可執行檔案; /:代表目錄; =:代表 socket 檔案; |:代表 FIFO 檔案;
-h :将檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來;
-i :列出 inode 号碼,inode 的意義下一章将會介紹;
-l :長資料串行出,包含檔案的屬性與權限等等資料;(常用)
-n :列出 UID 與 GID 而非使用者與群組的名稱 (UID 與 GID 會在賬号管理提到!) -r :将排序結果反向輸出,例如:原本檔名由小到大,反向則為由大到小;
-R :連同子目錄内容一起列出來,等于該目錄下的所有檔案都會顯示出來;
-S :以檔案容量大小排序,而不是用檔名排序;
-t :依時間排序,而不是用檔名。
--color=never :不要依據檔案特性給予顔色顯示; --color=always :顯示顔色
   
--color=auto :讓系統自行依據設定來判斷是否給予顔色
--full-time :以完整時間模式 (包含年、月、日、時、分) 輸出 --time={atime,ctime} :輸出 access 時間或改變權限屬性時間 (ctime)
而非内容變更時間 (modification time)           
6.2.2 複制、删除與移動: cp, rm, mv
  • cp
[root@study ~]# cp [-adfilprsu] 來源檔案(source) 目标檔案(destination) [root@study ~]# cp [options] source1 source2 source3 .... directory 選項與參數:
-a :相當于 -dr --preserve=all 的意思,至于 dr 請參考下列說明;(常用)
-d :若來源檔案為連結檔案的屬性(link file),則複制連結檔案屬性而非檔案本身; 
-f :為強制(force)的意思,若目标檔案已經存在且無法開啟,則移除後再嘗試一次; 
-i :若目标檔案(destination)已經存在時,在覆寫時會先詢問動作的進行(常用)
-l :進行硬式連結(hard link)的連結檔建立,而非複制檔案本身;
-p :連同檔案的屬性(權限、使用者、時間)一起複制過去,而非使用預設屬性(備份常用);
-r :遞歸持續複制,用于目錄的複制行為;(常用)
-s :複制成為符号連結檔案 (symbolic link),亦即『快捷方式』檔案;
-u :destination 比 source 舊才更新 destination,或 destination 不存在的情況下才複制。 --preserve=all :除了 -p 的權限相關參數外,還加入 SELinux 的屬性, links, xattr 等也複制了。 最後需要注意的,如果來源檔有兩個以上,則最後一個目的檔案一定要是『目錄』才行!           
  • rm
[root@study ~]# rm [-fir] 檔案或目錄
選項與參數:
-f :就是 force 的意思,忽略不存在的檔案,不會出現警告訊息;
-i :互動模式,在删除前會詢問使用者是否動作
-r :遞歸删除啊!最常用在目錄的删除了!這是非常危險的選項!!!           
  • mv
[root@study ~]# mv [-fiu] source destination
[root@study ~]# mv [options] source1 source2 source3 .... directory
選項與參數:
-f :force 強制的意思,如           
6.2.3 取得路徑的檔案名與目錄名稱
[root@study ~]# basename /etc/sysconfig/network 
network <== 很簡單!就取得最後的檔名~ 
[root@study ~]# dirname /etc/sysconfig/network
/etc/sysconfig <== 取得的變成目錄名了!           

6.3 檔案内容查閱

  • cat 由第一行開始顯示檔案内容
[root@study ~]# cat [-AbEnTv] 選項與參數:
-A :相當于 -vET 的整合選項,可列出一些特殊字元而不是空白而已; -b :列出行号,僅針對非空白行做行号顯示,空白行不标行号!
-E :将結尾的斷行字元 $ 顯示出來;
-n :列印出行号,連同空白行也會有行号,與 -b 的選項不同;
-T :将 [tab] 按鍵以 ^I 顯示出來; -v :列出一些看不出來的特殊字元           
  • tac 從最後一行開始顯示,可以看出 tac 是 cat 的倒着寫!
  • nl 顯示的時候,順道輸出行号!
  • more 一頁一頁的顯示檔案内容
  • less與 more 類似,但是比 more 更好的是,他可以往前翻頁!
  • head隻看頭幾行
  • tail 隻看尾巴幾行
  • od 以二進制的方式讀取檔案内容!

6.4 檔案與目錄的預設權限與隐藏權限

6.5 指令與檔案的搜尋

6.5.1 腳本檔案名的搜尋
  • which (尋找『執行檔』)
[root@study ~]# which [-a] command
選項或參數:
-a :将所有由 PATH 目錄中可以找到的指令均列出,而不止第一個被找到的指令名稱
範例一:搜尋 ifconfig 這個指令的完整檔案名 
[root@study ~]# which ifconfig 
/sbin/ifconfig           

範例二:用 which 去找出 which 的檔名為何?

[root@study ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/bin/alias
/usr/bin/which
# 竟然會有兩個 which ,其中一個是 alias 這玩意兒呢!那是啥?
# 那就是所謂的『指令别名』,意思是輸入 which 會等于後面接的那串指令啦! # 更多的資料我們會在 bash 章節中再來談的!           

這個指令是根據『PATH』這個環境變量所規範的路徑,去搜尋『執行檔』的檔名

6.5.2 檔案檔名的搜尋
  • whereis (由一些特定的目錄中尋找檔案檔案名)
[root@study ~]# whereis [-bmsu] 檔案或目錄名 選項與參數:
-l :可以列出 whereis 會去查詢的幾個主要目錄而已 
-b :隻找 binary 格式的檔案
-m :隻找在說明檔案 manual 路徑下的檔案
-s :隻找 source 來源檔案
-u :搜尋不在上述三個項目當中的其他特殊檔案
範例一:請找出 ifconfig 這個檔名
[root@study ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
範例二:隻找出跟 passwd 有關的『說明檔案』檔名(man page) 
[root@study ~]# whereis passwd # 全部的檔名通通列出來!
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
[root@study ~]# whereis -m passwd # 隻有在 man 裡面的檔名才抓出來! passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz           
  • locate / updatedb
[root@study ~]# locate [-ir] keyword 選項與參數:
-i :忽略大小寫的差異;
-c :不輸出檔名,僅計算找到的檔案數量
-l :僅輸出幾行的意思,例如輸出五行則是 -l 5
-S :輸出 locate 所使用的資料庫檔案的相關資訊,包括該資料庫紀錄的檔案/目錄數量等 
-r :後面可接正規表示法的顯示方式
範例一:找出系統中所有與 passwd 相關的檔名,且隻列出 5 個 
[root@study ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
範例二:列出 locate 查詢所使用的資料庫檔案之檔案名與各資料數量 [root@study ~]# locate -S
Database /var/lib/mlocate/mlocate.db:
8,086 directories # 總紀錄目錄數 109,605 files # 總紀錄檔案數 5,190,295 bytes in file names 2,349,150 bytes used to store database           
  • find
[root@study ~]# find [PATH] [option] [action]
選項與參數:
1. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明
-mtime n :n 為數字,意義為在 n 天之前的『一天之内』被更動過内容的檔案; -mtime +n :列出在 n 天之前(不含 n 天本身)被更動過内容的檔案檔名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更動過内容的檔案檔名。
-newer file :file 為一個存在的檔案,列出比 file 還要新的檔案檔名
範例一:将過去系統上面 24 小時内有更動過内容 (mtime) 的檔案列出 [root@study ~]# find / -mtime 0
# 那個 0 是重點!0 代表目前的時間,是以,從現在開始到 24 小時前, # 有變動過内容的檔案都會被列出來!那如果是三天前的 24 小時内?
# find / -mtime 3 有變動過的檔案都被列出的意思!
範例二:尋找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出 [root@study ~]# find /etc -newer /etc/passwd
# -newer 用在分辨兩個檔案之間的新舊關系是很有用的!           
選項與參數:
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 搜尋。
範例三:搜尋 /home 底下屬于 dmtsai 的檔案
[root@study ~]# find /home -user dmtsai
# 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時, # 就可以利用這個指令将屬于某個使用者的所有檔案都找出來喔!
範例四:搜尋系統中不屬于任何人的檔案
[root@study ~]# find / -nouser
# 透過這個指令,可以輕易的就找出那些不太正常的檔案。如果有找到不屬于系統任何人的檔案時, # 不要太緊張,那有時候是正常的~尤其是你曾經以原始碼自行編譯軟體時。           
選項與參數:
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.... 的屬性存在!
範例五:找出檔名為 passwd 這個檔案 [root@study ~]# find / -name passwd
範例五-1:找出檔案名包含了 passwd 這個關鍵詞的檔案
[root@study ~]# find / -name "*passwd*"
# 利用這個 -name 可以搜尋檔名啊!預設是完整檔案名,如果想要找關鍵詞, # 可以使用類似 * 的任意字元來處理
範例六:找出 /run 目錄下,檔案類型為 Socket 的檔名有哪些?
[root@study ~]# find /run -type s
# 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的檔案,
# 例如 socket 與 FIFO 檔案,可以用 find /run -type p 或 -type s 來找!
範例七:搜尋檔案當中含有 SGID 或 SUID 或 SBIT 的屬性
[root@study ~]# find / -perm /7000
# 所謂的 7000 就是 ---s--s--t ,那麼隻要含有 s 或 t 的就列出,是以當然要使用 /7000,
# 使用 -7000 表示要同時含有 ---s--s--t 的所有三個權限。而隻需要任意一個,就是 /7000