RHCSA 系列(二): 如何進行文件和目錄管理
RHCSA: 運行文件以及進行文件夾管理 - 第二部分
創建、刪除、複製和移動文件及目錄
文件和目錄管理是每一個系統管理員都應該掌握的必備技能。它包括了從頭開始的創建、刪除文本文件(每個程序的核心配置)以及目錄(你用來組織文件和其它目錄),以及識別已有文件的類型。
touch
命令 不僅僅能用來創建空文件,還能用來更新已有文件的訪問時間和修改時間。
touch 命令示例
你可以使用 file [filename]
來判斷一個文件的類型 (在你用文本編輯器編輯之前,判斷類型將會更方便編輯)。
file 命令示例
使用rm [filename]
可以刪除文件。
rm 命令示例
對於目錄,你可以使用mkdir [directory]
在已經存在的路徑中創建目錄,或者使用 mkdir -p [/full/path/to/directory]
帶全路徑創建文件夾。
mkdir 命令示例
當你想要去刪除目錄時,在你使用rmdir [directory]
前,你需要先確保目錄是空的,或者使用更加強力的命令(小心使用它!)rm -rf [directory]
。後者會強制刪除[directory]
以及它的內容,所以使用這個命令存在一定的風險。
輸入輸出重定向以及管道
命令行環境提供了兩個非常有用的功能:允許重定向命令的輸入和輸出為另一個文件,以及發送命令的輸出到另一個命令,這分別稱為重定向和管道。
為了理解這兩個重要概念,我們首先需要理解三個最重要的字元輸入輸出流類型,以 *nix 的話來說,它們實際上是特殊的文件。
- 標準輸入 (即 stdin),默認連接到鍵盤。 換句話說,鍵盤是輸入命令到命令行的標準輸入設備。
- 標準輸出 (即 stdout),默認連接到屏幕。 找個設備「接受」命令的輸出,並展示到屏幕上。
- 標準錯誤 (即 stderr),默認是命令的狀態消息出現的地方,它也是屏幕。
在下面的例子中,ls /var
的結果被發送到stdout(屏幕展示),ls /tecmint 的結果也一樣。但在後一種情況下,它顯示在標準錯誤輸出上。
輸入和輸出命令實例
為了更容易識別這些特殊文件,每個文件都被分配有一個文件描述符,這是用於訪問它們的抽象標識。主要要理解的是,這些文件就像其它的一樣,可以被重定向。這就意味著你可以從一個文件或腳本中捕獲輸出,並將它傳送到另一個文件、命令或腳本中。這樣你就可以在磁碟上存儲命令的輸出結果,用於稍後的分析。
要重定向 stdin (fd 0)、 stdout (fd 1) 或 stderr (fd 2),可以使用如下操作符。
轉向操作 | 效果 |
> | 重定向標準輸出到一個文件。如果目標文件存在,內容就會被重寫。 |
>> | 添加標準輸出到文件尾部。 |
2> | 重定向標準錯誤輸出到一個文件。如果目標文件存在,內容就會被重寫。 |
2>> | 添加標準錯誤輸出到文件尾部。 |
&> | 重定向標準錯誤和標準輸出到一個文件。如果目標文件存在,內容就會被重寫。 |
< | 使用特定的文件做標準輸入。 |
<> | 使用特定的文件做標準輸入和標準輸出。 |
與重定向相比,管道是通過在命令後和另外一個命令前之間添加一個豎杠(|)
。
記得:
- 重定向是用來定向命令的輸出到一個文件,或把一個文件發送作為到一個命令的輸入。
- 管道是用來將命令的輸出轉發到另一個命令作為其輸入。
重定向和管道的使用實例
例1:將一個命令的輸出到文件
有些時候,你需要遍歷一個文件列表。要做到這樣,你可以先將該列表保存到文件中,然後再按行讀取該文件。雖然你可以直接遍歷ls的輸出,不過這個例子是用來說明重定向。
# ls -1 /var/mail > mail.txt
將一個命令的輸出重定向到文件
例2:重定向stdout和stderr到/dev/null
如果不想讓標準輸出和標準錯誤展示在屏幕上,我們可以把這兩個文件描述符重定向到 /dev/null
。請注意對於同樣的命令,重定向是如何改變了輸出。
# ls /var /tecmint
# ls /var/ /tecmint &> /dev/null
重定向stdout和stderr到/dev/null
例3:使用一個文件作為命令的輸入
cat 命令的經典用法如下
# cat [file(s)]
您還可以使用正確的重定向操作符發送一個文件作為輸入。
# cat < mail.txt
cat 命令實例
例4:發送一個命令的輸出作為另一個命令的輸入
如果你有一個較大的目錄或進程列表,並且想快速定位,你或許需要將列表通過管道傳送給grep。
接下來我們會在下面的命令中使用管道,第一個管道是查找所需的關鍵詞,第二個管道是除去產生的 grep command
。這個例子列舉了所有與apache用戶有關的進程:
# ps -ef | grep apache | grep -v grep
發送一個命令的輸出作為另一個命令的輸入
歸檔,壓縮,解包,解壓文件
如果你需要傳輸、備份、或者通過郵件發送一組文件,你可以使用一個存檔(或打包)工具,如 tar,通常與gzip,bzip2,或 xz 等壓縮工具配合使用。
您選擇的壓縮工具每一個都有自己不同的壓縮速度和壓縮率。這三種壓縮工具,gzip是最古老和可以較小壓縮的工具,bzip2提供經過改進的壓縮,以及xz是最新的而且壓縮最大。通常情況下,使用這些壓縮工具壓縮的文件的擴展名依次是.gz、.bz2或.xz。
命令 | 縮寫 | 描述 |
–create | c | 創建一個tar歸檔 |
–concatenate | A | 添加tar歸檔到另外一個歸檔中 |
–append | r | 添加非tar歸檔到另外一個歸檔中 |
–update | u | 添加比歸檔中的文件更新的文件 |
–diff or –compare | d | 將歸檔中的文件和硬碟的文件進行對比 |
–list | t | 列舉一個tar壓縮包的內容 |
–extract or –get | x | 從歸檔中提取文件 |
操作參數 | 縮寫 | 描述 |
—directory dir | C | 在執行操作前更改目錄 |
—same-permissions and —same-owner | p | 分別保留許可權和所有者信息 |
–verbose | v | 列舉所有讀取或提取的文件,如果和 --list 參數一起使用,也會顯示文件的大小、所有權和時間戳 |
—exclude file | — | 從存檔中排除文件。在這種情況下,文件可以是一個實際的文件或匹配模式。 |
—gzip or —gunzip | z | 使用gzip壓縮歸檔 |
–bzip2 | j | 使用bzip2壓縮歸檔 |
–xz | J | 使用xz壓縮歸檔 |
例5:創建一個tar文件,然後使用三種壓縮工具壓縮
在決定使用這個還是那個工具之前,您可能想比較每個工具的壓縮效率。請注意壓縮小文件或幾個文件,結果可能不會有太大的差異,但可能會給你看出它們的差異。
# tar cf ApacheLogs-$(date +%Y%m%d).tar /var/log/httpd/* # Create an ordinary tarball
# tar czf ApacheLogs-$(date +%Y%m%d).tar.gz /var/log/httpd/* # Create a tarball and compress with gzip
# tar cjf ApacheLogs-$(date +%Y%m%d).tar.bz2 /var/log/httpd/* # Create a tarball and compress with bzip2
# tar cJf ApacheLogs-$(date +%Y%m%d).tar.xz /var/log/httpd/* # Create a tarball and compress with xz
tar 命令實例
例6:歸檔時同時保存原始許可權和所有權
如果你正在從用戶的主目錄創建備份,你需要要存儲的個人文件與原始許可權和所有權,而不是通過改變它們的用戶帳戶或守護進程來執行備份。下面的命令可以在歸檔時保留文件屬性。
# tar cJf ApacheLogs-$(date +%Y%m%d).tar.xz /var/log/httpd/* --same-permissions --same-owner
創建軟連接和硬鏈接
在Linux中,有2種類型的鏈接文件:硬鏈接和軟(也稱為符號)鏈接。因為硬鏈接文件只是現存文件的另一個名字,使用相同的 inode 號,它指向實際的數據;而符號鏈接只是指向的文件名。
此外,硬鏈接不佔用磁碟上的空間,而符號鏈接則佔用少量的空間來存儲的鏈接本身的文本。硬鏈接的缺點就是要求它們必須在同一個文件系統內,因為 inode 在一個文件系統內是唯一的。而符號鏈接沒有這個限制,它們通過文件名而不是 inode 指向其它文件或目錄,所以可以跨文件系統。
創建鏈接的基本語法看起來是相似的:
# ln TARGET LINK_NAME #從LINK_NAME到Target的硬鏈接
# ln -s TARGET LINK_NAME #從LINK_NAME到Target的軟鏈接
例7:創建硬鏈接和軟鏈接
沒有更好的方式來形象的說明一個文件和一個指向它的硬鏈接或符號鏈接的關係,而不是創建這些鏈接。在下面的截圖中你會看到文件和指向它的硬鏈接共享相同的inode,都是使用了相同的466個位元組的磁碟。
另一方面,在別的磁碟創建一個硬鏈接將佔用5個位元組,這並不是說你將耗盡存儲容量,而是這個例子足以說明一個硬鏈接和軟鏈接之間的區別。
軟連接和硬鏈接之間的不同
在Linux系統上符號鏈接的典型用法是指向一個帶版本的文件。假設有幾個程序需要訪問文件fooX.Y,但麻煩是版本經常變化(像圖書館一樣)。每次版本更新時我們都需要更新指向 fooX.Y 的單一引用,而更安全、更快捷的方式是,我們可以讓程序尋找名為 foo 的符號鏈接,它實際上指向 fooX.Y。
這樣的話,當你的X和Y發生變化後,你只需更新符號鏈接 foo 到新的目標文件,而不用跟蹤每個對目標文件的使用並更新。
總結
在這篇文章中,我們回顧了一些基本的文件和目錄管理技能,這是每個系統管理員的工具集的一部分。請確保閱讀了本系列的其它部分,並將這些主題與本教程所涵蓋的內容相結合。
如果你有任何問題或意見,請隨時告訴我們。我們總是很高興從讀者那獲取反饋.
via: http://www.tecmint.com/file-and-directory-management-in-linux/
作者:Gabriel Cánepa 譯者:xiqingongzi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive