Linux零基礎入門第五課

文件的基本操做(下)

文件屬性

file命令
語法
>$ file file0 [file1 file2 ...]

file命令用於確認文件的類型。
Linux下,一般並不會嚴格按照文件擴展名來肯定文件的類型,尤爲是可執行程序每每是沒有擴展名的。
file命令能夠查看文件的具體類型,若是是可執行程序,還會顯示其位數、連接信息等數據,以下所示:html

>$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d0bc0fb9b3f60f72bbad3c5a1d24c9e2a1fde775, stripped
stat命令
語法
>$ stat file0 [file1 file2]

stat命令用來查看文件的詳細屬性,相似於ls -l,但它們又有所不一樣,咱們經過一個例子來詳解各個指標。node

>$ stat /bin/ls
  File: '/bin/ls'
  Size: 126584      Blocks: 248        IO Block: 4096   regular file
Device: 805h/2053d  Inode: 980781      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-06-12 21:03:56.231999815 +0800
Modify: 2017-03-03 02:07:22.000000000 +0800
Change: 2018-02-06 15:52:08.189466243 +0800
 Birth: -

File:文件名。
Size:文件的大小,單位是字節。
Blocks:文件佔用了多少個數據塊。(注意磁盤是塊設備,數據是按塊爲基本單位存儲的,而不是按照字節爲基本單位。)
IO Block:每一個塊可以存儲多少字節的數據。
regular file:這個字段是文件的類型。regular file 表示這是一個普通文件。
Device:設備號。
Inode:文件的Inode號。Inode是文件系統在磁盤上用來保存文件屬性數據的,裏面包含了除了文件名之外的全部文件屬性。而文件名是保存在目錄文件中的,目錄也是文件,它是用來保存文件的特殊文件。
Links:文件的硬連接數量。
Access:文件權限。
Uid:文件屬主。
Gid:文件屬組。
Access Time:又稱atime,表示文件的訪問時間。當文件的內容被訪問時更新此時間戳。
Modify Time:又稱mtime,表示文件的修改時間。當文件的內容被修改時更新此時間戳。
Change Time:又稱ctime,表示文件狀態修改時間。當文件的狀態(或屬性)被修改時更新此時間戳,例如修改權限、建立或刪除硬連接等等。linux

文件權限

chmod命令
語法
>$ chmod [-R] mask name

chmod命令是用來修改文件的權限的。
在 Linux 系統中,任何一個文件均可以被分配三個權限,即可讀可寫可執行
而每一個用戶對一個文件而言都至少擁有下面三個身份中的一個,即文件的擁有者與文件擁有者在相同的用戶組其餘用戶
那麼這三個權限與三個身份之間有着什麼樣的聯繫呢,咱們且先看一下某個文件的屬性。shell

>$ ls -l /bin/ls
-rwxr-xr-x 1 root root 126584 3月   3  2017 /bin/ls

文件/bin/ls的屬性中,第一個字段-rwxr-xr-x就表示文件的類型和權限,咱們在後面進行詳細介紹。接下來看第三和第四兩個字段,均爲root。第一個root表示文件歸屬於哪一個用戶,下文稱其爲文件的「屬主」。第二個root表示文件歸屬於哪一個用戶組,下文稱其爲文件的「屬組」。其它的字段與權限無關,咱們這裏就不展開介紹了。
接下來咱們先解釋第一個字段的含義,把-rwxr-xr-x分爲四個部分來解讀,以下表所示:
| 段 | 含義 |
| :-: | - |
| - | 文件類型 |
| rwx | 屬主的權限 |
| r-x | 屬組的權限 |
| r-x | 其餘用戶的權限 |
表1 權限段
avatar
圖1 文件權限
文件類型中的-表示這是一個普通文件,常見的文件類型見下表:
| 標識符 | 類型 |
| :-: | - |
| d | 文件夾 |
| - | 普通文件 |
| l | 符號連接 |
| p | 管道文件 |
| b | 塊設備文件 |
| c | 字符設備文件 |
| s | 套接字文件 |
表2 文件類型
文件權限部分共出現了4種字符,分別表示不一樣的權限,以下表所示:
| 標識符 | 八進制權重 | 權限 |
| :-: | :-: | - |
| r | 4 | 可讀 |
| w | 2 | 可寫 |
| x | 1 | 對文件表示可執行,對文件夾表示可進入 |
| - | 0 | 無此權限 |
表3 權限值
由此咱們能夠解讀出-rwxr-xr-x表示:數據庫

這是一個普通文件;
文件的全部者對其擁有可讀、可寫、可執行的權限;
與文件全部者在相同用戶組的用戶對其擁有可讀、可執行的權限;
其它用戶擁有可讀、可執行的權限。express

文件權限的八進制表示法

權限中的 owner、group、other 的每一部分的權限分別能夠計算出一個八進制值,三個八進制值合併在一塊就能夠表示一個文件的完整權限。
如表3所示,不一樣的權限對應着一個權重值,將每一部分權限的權重值相加就能夠獲得這一部分的權重。
還用上面的/bin/ls文件的權限爲例,它的八進制權限計算過程以下:編程

(r w x) (r - x) (r - x)
(4+2+1) (4+0+1) (4+0+1) = 7 5 5

所以-rwxr-xr-x對應的八進制權限就是755ubuntu

chmod的用法

有了前面的知識,咱們就能夠看下chmod命令的用法的。它在修改文件權限的時候既可以使用八進制的形式也可以使用標識符的形式來指示權限。vim

使用八進制方式修改文件的權限

咱們經過下面的例子使用八進制的方式將/bin/ls文件的權限修改成「屬主可讀、屬組可讀寫、其餘用戶可執行」:安全

>$ $ sudo chmod 461 /bin/ls
>$ ls -l /bin/ls
-r--rw---x 1 root root 126584 3月   3  2017 /bin/ls

461權限對應的標識符是什麼呢,你們能夠根據前面學到的知識計算一下。

使用標識符的形式修改文件的權限

使用標識符的形式修改文件的權限,須要分別指定爲哪一個組別的用戶修改權限,組別使用下表的字符來表示:
| 標識符 | 組別 |
| :-: | - |
| a | 全部用戶 |
| u | 屬主 |
| g | 屬組 |
| o | 其餘用戶 |
表4 組別標識符
使用表4中的組別標識符和表3的權限標識符組合,就能夠修改對應組別的權限了。
經過下面的例子,咱們將/bin/ls文件的權限修改成「屬主擁有可讀、可寫、可執行的權限;屬組和其它用戶均擁有可讀和和執行的權限」。

>$ ls -l /bin/ls
-r--rw---x 1 root root 126584 3月   3  2017 /bin/ls

>$ sudo chmod u+wx /bin/ls
>$ ls -l /bin/ls
-rwxrw---x 1 root root 126584 3月   3  2017 /bin/ls

>$ sudo chmod g-w /bin/ls
>$ ls -l /bin/ls
-rwxr----x 1 root root 126584 3月   3  2017 /bin/ls
>$ sudo chmod g+x /bin/ls
>$ ls -l /bin/ls
-rwxr-x--x 1 root root 126584 3月   3  2017 /bin/ls

>$ sudo chmod o+r /bin/ls
>$ ls -l /bin/ls
-rwxr-xr-x 1 root root 126584 3月   3  2017 /bin/ls

上例中每一次修改咱們均可以看到對應的權限發生了變化。
使用標識符來修改權限的一個常見的場景是在建立腳本的時候,出於安全方面的考量,通常狀況使用touch命令建立一個腳本文件後,該文件並不具有可執行的權限,咱們須要手動爲全部的用戶都添加上可執行的權限,那麼能夠按照以下方式方便的受權:

>$ touch test.sh
>$ ls -l test.sh 
-rw-rw-r-- 1 user user 0 6月  27 20:42 test.sh
>$ chmod a+x test.sh 
>$ ls -l test.sh 
-rwxrwxr-x 1 user user 0 6月  27 20:42 test.sh

從這個例子中能夠清楚的看到,使用a+x很方便的爲全部的用戶添加了可執行權限。

若是要遞歸爲目錄中的子文件修改權限,只需添加-R參數便可,以下所示:

>$ chmod 777 -R /tmp/17bang
>$ chmod a+x -R /tmp/17bang
chown命令

此命令用於修改文件或目錄的屬主,也可同時修改屬組。

>$ chown user[:group] [-R] dir/file

經過上面chmod命令咱們知道了,文件的全部者和用戶所在的用戶組會決定一個用戶對某個文件具備什麼樣的權限,那麼chown命令就是用來修改一個文件的屬主屬組的。
使用示例:

>$ ls -l 17bang.txt 
-rw-rw-r-- 1 user user 0 7月   5 18:51 17bang.txt
>$ sudo chown root 17bang.txt 
>$ ls -l 17bang.txt
-rw-rw-r-- 1 root user 0 7月   5 18:51 17bang.txt
>$ sudo chown root:root 17bang.txt 
>$ ls -l 17bang.txt
-rw-rw-r-- 1 root root 0 7月   5 18:51 17bang.txt

注意:chown命令只有超級用戶才能使用。
試想一下爲何會有這樣的限定呢?
舉個栗子來講,若是任何用戶均可以使用chown命令來修改文件的全部者,那麼就能夠輕易繞過磁盤配額的控制了。
假設管理員爲用戶A分配了必定的磁盤空間,當用戶A的磁盤空間不足時,ta就能夠經過chown命令將某些文件的全部者修改成另外一個用戶B,這樣這筆帳就寄在用戶B的頭上了。當用戶A須要使用此文件時,再將全部者改回來就好了。而用戶B卻徹底不知道本身在用戶A的家目錄中還有所屬的文件,白白的爲用戶A背了鍋。

chgrp命令

此命令專門用來修改文件和目錄的屬組,用法與chown相似,這裏就再也不展開介紹了。

查找文件

whichlocatefind命令是三個常見的查找文件的命令,下面咱們分別進行介紹。

which命令

which是 shell 的內建命令,一般用於查找某個命令的路徑,由於它只從$PATH環境變量所指定的路徑中尋找文件。

>$ which ls
/bin/ls
locate命令

locate命令從/var/lib/mlocate/mlocate.db數據庫文件中查詢文件的所在路徑,所以檢索速度很是快。
系統會在特定的時間自動調用updatedb命令來更新這個數據庫文件,所以locate命令並不能查詢到系統中最新添加的文件,而是要等待必定的時間後才能查詢獲得。

>$ locate .vimrc
/home/user/.vimrc

-c參數能夠統計數量。
-i參數能夠忽略大小寫。

find命令

find命令是全部查找命令中最經常使用也最強大的,它不只能夠經過文件名來查詢,也能夠經過文件類型和屬性來查找文件。

>$ find [path] [expression]

咱們這裏只舉個用文件名查找文件的栗子。

>$ find /etc -name "*.conf"
/etc/depmod.d/ubuntu.conf
/etc/rsyslog.conf
/etc/sensors3.conf
/etc/ca-certificates.conf
......

若是不加路徑,則默認爲查找當前目錄下的文件。

$ find -name "*.txt"
./.mozilla/firefox/s7tyv1vj.default-1530780643269/SiteSecurityServiceState.txt
./.mozilla/firefox/s7tyv1vj.default-1530780643269/pkcs11.txt

find命令還有許多其它高級的用法,你們能夠試着本身找找資料,並動手實驗一下。

上面的內容不過癮?更深刻的知識能夠參考LZ的博客:(三) 一塊兒學 Unix 環境高級編程 (APUE) 之 文件和目錄

相關文章
相關標籤/搜索