操作文件和目錄
cp — 複製文件和目錄
mv — 移動/重命名文件和目錄
mkdir — 創建目錄
rm — 刪除文件和目錄
ln — 創建硬鏈接和符號鏈接
如果是簡單的文件和目錄操作任務,使用圖形化界面的文件管理器會更容易些,但是對於複雜的文件操作任務,則使用命令行更方便,因爲有通配符的存在。(eg:如何拷貝一個目錄下的所有HTML文件)
通配符
因爲 shell 頻繁地使用文件名,shell 提供了特殊字符來幫助你快速指定一組文件名。這些特殊字符叫做通配符。使用通配符(文件名代換)允許你依據字符的組合模式來選擇文件名。
接受文件名作爲參數的任何命令,都可以使用通配符。
通配符 | 意義 |
---|---|
* | 匹配任意多個字符(包括零個或一個) |
? | 匹配任意一個字符(不包括零個) |
[characters] | 匹配任意一個屬於字符集中的字符 |
[!characters] | 匹配任意一個不是字符集中的字符 |
[[:class:]] | 匹配任意一個屬於指定字符類中的字符 |
字符類 | 意義 |
---|---|
[:alnum:] | 匹配任意一個字母或數字 |
[:alpha:] | 匹配任意一個字母 |
[:digit:] | 匹配任意一個數字 |
[:lower:] | 匹配任意一個小寫字母 |
[:upper:] | 匹配任意一個大寫字母 |
模式 | 匹配對象 |
---|---|
* | 所有文件 |
g* | 文件名以“g”開頭的文件 |
b*.txt | 以"b"開頭,中間有零個或任意多個字符,並以".txt"結尾的文件 |
Data??? | 以“Data”開頭,其後緊接着3個字符的文件 |
[abc]* | 文件名以"a","b",或"c"開頭的文件 |
BACKUP.[0-9][0-9][0-9] | 以"BACKUP."開頭,並緊接着3個數字的文件 |
[[:upper:]]* | 以大寫字母開頭的文件 |
[![:digit:]]* | 不以數字開頭的文件 |
*[[:lower:]123] | 文件名以小寫字母結尾,或以 “1”,“2”,或 “3” 結尾的文件 |
字符範圍
使用字符集的時候可以利用中劃線表示字符範圍,比如[a-e]、[1-6]。
通配符在 GUI 中也有效
- 在 Nautilus (GNOME 文件管理器)中,可以通過 Edit/Select 模式菜單項來選擇文件。 輸入一個用通配符表示的文件選擇模式後,那麼當前所瀏覽的目錄中,所匹配的文件名就會高亮顯示。
- 在 Dolphin 和 Konqueror(KDE 文件管理器)中,可以在地址欄中直接輸入通配符。例如, 如果你想查看目錄 /usr/bin 中,所有以小寫字母 ‘u’ 開頭的文件, 在地址欄中敲入 ‘/usr/bin/u*‘,則 文件管理器會顯示匹配的結果。
創建目錄
mkdir directory...
注意表示法:在描述一個命令時,當有三個圓點跟在一個命令的參數後面, 這意味着那個參數可以有多個。(eg:mkdir dir1 dir2 dir3)
複製文件和目錄
可以將一個文件中的內容複製到另一個文件中。
cp item1 item2
可以複製單個或多個項目(文件和目錄)到一個目錄下。
cp item... directory
選項 | 意義 |
---|---|
-a, --archive | 複製文件和目錄,以及它們的屬性,包括所有權和權限。 通常,複本具有用戶所操作文件的默認屬性。 |
-i, --interactive | 在重寫已存在文件之前,提示用戶確認。如果這個選項不指定, cp 命令會默認重寫文件。 |
-r, --recursive | 遞歸地複製目錄及目錄中的內容。當複製目錄時, 需要這個選項(或者-a 選項)。 |
-u, --update | 當把文件從一個目錄複製到另一個目錄時,僅複製 目標目錄中不存在的文件,或者是文件內容新於目標目錄中已經存在的文件。 |
-v, --verbose | 顯示翔實的命令操作信息 |
命令 | 運行結果 |
---|---|
cp file1 file2 | 複製文件 file1 內容到文件 file2。如果 file2 已經存在, file2 的內容會被 file1 的內容重寫。如果 file2 不存在,則會創建 file2。 |
cp -i file1 file2 | 這條命令和上面的命令一樣,除了如果文件 file2 存在的話,在文件 file2 被重寫之前, 會提示用戶確認信息。 |
cp file1 file2 dir1 | 複製文件 file1 和文件 file2 到目錄 dir1。目錄 dir1 必須存在。 |
cp dir1/* dir2 | 使用一個通配符,在目錄 dir1 中的所有文件都被複制到目錄 dir2 中。 dir2 必須已經存在。 |
cp -r dir1 dir2 | 複製目錄 dir1 中的內容到目錄 dir2。如果目錄 dir2 不存在, 創建目錄 dir2,操作完成後,目錄 dir2 中的內容和 dir1 中的一樣。 如果目錄 dir2 存在,則目錄 dir1 (和目錄中的內容)將會被複制到 dir2 中。 |
移動和重命名文件
mv 命令可以執行文件移動和文件命名任務,這依賴於你怎樣使用它。任何一種 情況下,完成操作之後,原來的文件名不再存在。
把文件或目錄 “item1” 重命名爲 “item2”。
mv item1 item2
把一個或多個條目從一個目錄移動到另一個目錄中。
mv item... directory
選項 | 意義 |
---|---|
-i --interactive | 在重寫一個已經存在的文件之前,提示用戶確認信息。 如果不指定這個選項,mv 命令會默認重寫文件內容。 |
-u --update | 當把文件從一個目錄移動另一個目錄時,只是移動不存在的文件, 或者文件內容新於目標目錄相對應文件的內容。 |
-v --verbose | 當操作 mv 命令時,顯示翔實的操作信息。 |
mv file1 file2 |
移動 file1 到 file2。如果 file2 存在,它的內容會被 file1 的內容重寫。 如果 file2 不存在,則創建 file2。 這兩種情況下,file1 都不再存在。 |
mv -i file1 file2 | 除了如果 file2 存在的話,在 file2 被重寫之前,用戶會得到提示信息外,這個和上面的選項一樣。 |
mv file1 file2 dir1 | 移動 file1 和 file2 到目錄 dir1 中。dir1 必須已經存在。 |
mv dir1 dir2 | 如果目錄 dir2 不存在,創建目錄 dir2,並且移動目錄 dir1 的內容到目錄 dir2 中,同時刪除目錄 dir1。如果目錄 dir2 存在,移動目錄 dir1(及它的內容)到目錄 dir2。 |
刪除文件和目錄
rm item...
選項 | 意義 |
---|---|
-i, --interactive | 在刪除已存在的文件前,提示用戶確認信息。 如果不指定這個選項,rm 會默默地刪除文件 |
-r, --recursive | 遞歸地刪除文件,這意味着,如果要刪除一個目錄,而此目錄 又包含子目錄,那麼子目錄也會被刪除。要刪除一個目錄,必須指定這個選項。 |
-f, --force | 忽視不存在的文件,不顯示提示信息。這選項覆蓋了“--interactive”選項。 |
-v, --verbose | 在執行 rm 命令時,顯示翔實的操作信息。 |
命令 | 運行結果 |
---|---|
rm file1 | 默默地刪除文件 |
rm -i file1 | 除了在刪除文件之前,提示用戶確認信息之外,和上面的命令作用一樣。 |
rm -r file1 dir1 | 刪除文件 file1, 目錄 dir1,及 dir1 中的內容。 |
rm -rf file1 dir1 | 同上,除了如果文件 file1,或目錄 dir1 不存在的話,rm 仍會繼續執行。 |
小貼士: 當你使用帶有通配符的rm命令時(除了仔細檢查輸入的內容外), 先用 ls 命令來測試通配符。這會讓你看到將要被刪除的文件是什麼。然後按下上箭頭按鍵,重新調用剛剛執行的命令,用 rm 替換 ls。
命令的使用
type – 說明怎樣解釋一個命令名
which – 顯示會執行哪個可執行程序
man – 顯示命令手冊頁
apropos – 顯示一系列適合的命令
info – 顯示命令 info
whatis – 顯示一個命令的簡潔描述
alias – 創建命令別名
什麼是命令
命令可以是下面四種類型之一:
-
是一個可執行程序,就像我們所看到的位於目錄/usr/bin 中的文件一樣。 這一類程序可以是用諸如 C 和 C++語言寫成的程序編譯的二進制文件, 也可以是由諸如shell,perl,python,ruby等等腳本語言寫成的程序 。
-
是一個內建於 shell 自身的命令。bash 支持若干命令,內部叫做 shell 內部命令 (builtins)。例如,cd 命令,就是一個 shell 內部命令。
-
是一個 shell 函數。這些是小規模的 shell 腳本,它們混合到環境變量中。 在後續的內容裏,我們將討論配置環境變量以及書寫 shell 函數。但是現在, 僅僅意識到它們的存在就可以了。
-
是一個命令別名。我們可以定義自己的命令,建立在其它命令之上。
顯示命令的類型
type 命令是 shell 內部命令,它會顯示命令的類別。
type command
顯示一個可執行程序的位置
which command
這個命令只對可執行程序有效,不包括內建命令和命令別名,別名是真正的可執行程序的替代物。 當我們試着使用 shell 內建命令時,例如,cd 命令,我們或者得不到迴應,或者是個錯誤信息。
在zsh中,顯示命令位置的關鍵字是where。
得到 shell 內建命令的幫助文檔
help command
注意表示法:出現在命令語法說明中的方括號,表示可選的項目。一個豎槓字符表示互斥選項。(eg:cd [-L|-P] [dir])
顯示用法信息
許多可執行程序支持一個 --help 選項,這個選項是顯示命令所支持的語法和選項說明。
command --help
顯示程序手冊頁
許多希望被命令行使用的可執行程序,提供了一個正式的文檔,叫做手冊或手冊頁(man page)。
man command
在大多數 Linux 系統中,man 使用 less 工具來顯示參考手冊,所以當瀏覽文檔時, less 命令都能有效。
man 所顯示的參考手冊,被分成幾個章節,它們不僅僅包括用戶命令,也包括系統管理員命令、程序接口、文件格式等等。
章節 | 內容 |
---|---|
1 | 用戶命令 |
2 | 程序接口內核系統調用 |
3 | C 庫函數程序接口 |
4 | 特殊文件,比如說設備結點和驅動程序 |
5 | 文件格式 |
6 | 遊戲娛樂,如屏幕保護程序 |
7 | 其他方面 |
8 | 系統管理員命令 |
我們可以指定章節號來查看需要的信息。尤其是如果我們要查找一種文件格式,而同時它也是一個命令名時,不指定章節號將總是得到第一個匹配項。
man chapternumber command
顯示適當的命令
apropos keyword
基於關鍵詞,搜索參考手冊列表中可能的匹配項。
輸出結果每行的第一個字段是手冊頁的名字,第二個字段展示章節。注意,man 命令加上”-k”選項, 和 apropos 完成一樣的功能。
顯示非常簡潔的命令說明
whatis 程序顯示匹配特定關鍵字的手冊頁的名字和一行命令說明。
whatis command
顯示程序 Info 條目
GNU 項目提供了一個命令程序手冊頁的替代物,稱爲”info”。info 內容可通過 info 閱讀器 程序讀取。info 頁是超級鏈接形式的,和網頁很相似。
info command
info 程序讀取 info 文件,info 文件是樹型結構,分化爲各個結點,每一個結點包含一個題目。 info 文件包含超級鏈接,可以讓你從一個結點跳到另一個結點。超級鏈接可通過它開頭的星號來辨別出來,把光標放在它上面並按下 enter 鍵,就可以激活它。
命令 | 行爲 |
---|---|
? | 顯示命令幫助 |
PgUp or Backspace | 顯示上一頁 |
PgDn or Space | 顯示下一頁 |
n | 下一個 - 顯示下一個結點 |
p | 上一個 - 顯示上一個結點 |
u | Up - 顯示當前所顯示結點的父結點,通常是個菜單 |
Enter | 激活光標位置下的超級鏈接 |
q | 退出 |
我們所討論的大多數命令行程序,屬於 GNU 項目”coreutils”包,所以輸入:info coreutils 將會顯示一個包含超級鏈接的手冊頁,這些超級鏈接指向包含在 coreutils 包中的各個程序。
README 和其它程序文檔
許多安裝在系統中的軟件,都有自己的文檔文件,這些文件位於/usr/share/doc 目錄下。 這些文件大多數是以文本文件的形式存儲的,可用 less 閱讀器來瀏覽。一些文件是 HTML 格式, 可用網頁瀏覽器來閱讀。我們可能遇到許多以”.gz”結尾的文件。這表示 gzip 壓縮程序 已經壓縮了這些文件。gzip 軟件包包括一個特殊的 less 版本,叫做 zless,zless 可以顯示由 gzip 壓縮的文本文件的內容。
用別名(alias)創建自己的命令
命令行小技巧,我們可以把多個命令放在同一行,命令之間用";"分開即可。
command1; command2; command3...
通過 alias 命令可以把這一串命令轉變爲一個命令。
alias new_command='command1; command2; command3...'
刪除別名,使用 unalias 命令。
unalias new_command
雖然要儘量避免使用已經存在的命令名來命名別名,但是通常我們會把一個普遍用到的參數選項加到常用的命令後面。(例如 ls 命令,其實是 ls --color=tty 的別名,加入了色彩支持)
注意:在命令行中定義的別名,是有生命週期的。當你的 shell 會話結束時,它們會消失。如果希望別名一直存在,需要爲其配置系統環境。