前面講了 shell 是什么详瑞?如何在 Linux 寫切換工作目錄掂林?還有幾個對使用 Linux 系統(tǒng)有幫助的命令(ls、file坝橡、less/more)泻帮。如果聽到這些概念你還不知道說的是什么,那建議你回過頭去看看前面幾天的內(nèi)容计寇,掌握了這些內(nèi)容锣杂,我們也就算是能把 Linux 系統(tǒng)用起來了,但這還遠(yuǎn)遠(yuǎn)不夠番宁,今天我們繼續(xù)學(xué)習(xí)幾個操作文件和目錄的 Linux 命令元莫。
- cp:拷貝文件和目錄的命令
- mv:移動或者重名了文件和目錄的命令
- mkdir:創(chuàng)建目錄的命令
- rm:刪除文件或者目錄的命令
- ln:創(chuàng)建符號鏈接的命令
以上這 5 個命令在我們使用 Linux 系統(tǒng)的過程中經(jīng)常會用到,它們都是可以操作文件或者目錄的蝶押。
我們的 Ubuntu 18.04 Desktop 這個操作系統(tǒng)也是帶圖形界面的踱蠢,在圖形界面的文件管理器這個軟件中,我們可以輕松的完成文件或者目錄的移動棋电、重命名茎截、刪除等操作,那為什么還要學(xué)習(xí)命令行工具 cp离陶、mv稼虎、mkdir、rm招刨、ln 呢霎俩?
答案是命令行工具比圖像界面工具強(qiáng)大,特別是對于復(fù)雜的文件或者目錄的操作沉眶,使用命令行工具往往更占優(yōu)勢打却,比如:我們要復(fù)制一個目錄下的所有以 .html
結(jié)尾的文件到另一個目錄,而且另一個目錄如果包含相同的文件的話谎倔,只有當(dāng)前目錄的文件比另一個目錄的文件更新時才復(fù)制柳击,否則不復(fù)制。在這個例子中片习,不是說我們不能使用圖形界面的文件管理器工具完成捌肴,只是會比較麻煩蹬叭,但是使用命令行工具的話,就是一行命令就搞定了:cp -u *.html destination
状知。
在介紹上面 5 個操作文件或者目錄的命令行工具之前秽五,先來看看 shell 命令的一些特性,這些特性對我們操作文件或者目錄相當(dāng)?shù)挠杏眉病hell 提供一些特殊的字符來匹配具有相同屬性的文件或者目錄坦喘,例如上面的拷貝的例子中就有 *
這個特殊字符。我們把這些特殊字符叫做通配符西设,下面是 shell 中常用的通配符:
- *:匹配任意多個字符(包括零個或一個)
- ?:匹配任意一個字符(不包括零個)
- [characters]:匹配任意一個屬于字符集中的字符
- [!characters]:匹配任意一個不是字符集中的字符
- [[:class:]]:匹配任意一個屬于指定字符類中的字符
除了通配符外瓣铣,shell 還提供了字符類供 shell 命令匹配使用,如下:
- [:alnum:]:匹配任意一個字母或數(shù)字
- [:alpha:]:匹配任意一個字母
- [:digit:]:匹配任意一個數(shù)字
- [:lower:] :匹配任意一個小寫字母
- [:upper:]:匹配任意一個大寫字母
借助通配符贷揽,為文件名構(gòu)建非常復(fù)雜的選擇標(biāo)準(zhǔn)成為可能棠笑。下面是一些類型匹配的范例:
- *:所有文件
- g*:所有文件名以 "g" 開頭的文件
- b*.txt:以 "b" 開頭,中間有零個或任意多個字符擒滑,并以 ".txt" 結(jié)尾的文件
- Data???:以 "Data" 開頭腐晾,其后緊接著 3 個字符的文件
- [abc]*:文件名以 "a", "b" , 或 "c" 開頭的文件
- BACKUP.[0-9][0-9][0-9]:以 "BACKUP." 開頭,并緊接著 3 個數(shù)字的文件
- [[:upper:]]*:以大寫字母開頭的文件
- [![:digit:]]*:不以數(shù)字開頭的文件
- *[[:lower:]123]:文件名以小寫字母結(jié)尾丐一,或以 "1" , "2" 或 "3" 結(jié)尾的文件
上面這些通配符和字符類非常重要,這對我們更好的使用 Linux 系統(tǒng)是很有幫助的淹冰,所以一定要結(jié)合例子深入的理解库车。下面我們正式開始介紹今天的 5 的命令。
1. mkdir
用法:mkdir directory...
說明:在描述一個命令時(如上所示)樱拴,當(dāng)有三個圓點(diǎn)跟在一個命令的參數(shù)后面柠衍, 這意味著那個參數(shù)可以重復(fù),就像這樣:
-
mkdir dir1
:會創(chuàng)建一個名為 "dir1" 的目錄 -
mkdir dir1 dir2 dir3
:會創(chuàng)建三個目錄晶乔,名為 dir1珍坊, dir2,dir3正罢。
2. cp
cp 命令阵漏,復(fù)制文件或者目錄。它有兩種使用方法:
-
cp item1 item2
:復(fù)制單個文件或目錄 "item1" 到文件或目錄 "item2" -
cp item... directory
:復(fù)制多個項目(文件或目錄)到一個目錄下翻具。
cp 命令也是可以帶參數(shù)的履怯,下面是一些常用的參數(shù):
- a:復(fù)制文件和目錄,以及它們的屬性裆泳,包括所有權(quán)和權(quán)限叹洲。 通常,副本具有用戶所操作文件的默認(rèn)屬性工禾。
- i:在重寫已存在文件之前运提,提示用戶確認(rèn)蝗柔。如果這個選項不指定, cp 命令會默認(rèn)重寫文件民泵。
- r:遞歸地復(fù)制目錄及目錄中的內(nèi)容癣丧。當(dāng)復(fù)制目錄時, 需要這個選項(或者-a 選項)洪灯。
- u:當(dāng)把文件從一個目錄復(fù)制到另一個目錄時坎缭,僅復(fù)制 目標(biāo)目錄中不存在的文件,或者是文件內(nèi)容新于目標(biāo)目錄中已經(jīng)存在的文件签钩。
- v:顯示翔實的命令操作信息
下面是 cp 命令的寫使用示例掏呼,請大家練習(xí)使用:
-
cp file1 file2
:復(fù)制文件 file1 內(nèi)容到文件 file2。如果 file2 已經(jīng)存在铅檩, file2 的內(nèi)容會被 file1 的內(nèi)容重寫憎夷。如果 file2 不存在,則會創(chuàng)建 file2昧旨。 -
cp -i file1 file2
:這條命令和上面的命令一樣拾给,除了如果文件 file2 存在的話,在文件 file2 被重寫之前兔沃, 會提示用戶確認(rèn)信息蒋得。 -
cp file1 file2 dir1
:復(fù)制文件 file1 和文件 file2 到目錄 dir1。目錄 dir1 必須存在乒疏。 -
cp dir1/* dir2
:使用一個通配符额衙,在目錄 dir1 中的所有文件都被復(fù)制到目錄 dir2 中。 dir2 必須已經(jīng)存在怕吴。 -
cp -r dir1 dir2
:復(fù)制目錄 dir1 中的內(nèi)容到目錄 dir2窍侧。如果目錄 dir2 不存在, 創(chuàng)建目錄 dir2转绷,操作完成后伟件,目錄 dir2 中的內(nèi)容和 dir1 中的一樣。 如果目錄 dir2 存在议经,則目錄 dir1 (和目錄中的內(nèi)容)將會被復(fù)制到 dir2 中斧账。
3. mv
mv 命令可以執(zhí)行文件移動和文件命名任務(wù),這依賴于你怎樣使用它爸业。任何一種 情況下其骄,完成操作之后,原來的文件名不再存在扯旷。mv 使用方法與 cp 很相像:
-
mv item1 item2
:把文件或目錄 "item1" 移動或重命名為 "item2" -
mv item... directory
:把一個或多個條目從一個目錄移動到另一個目錄中拯爽。
mv 命令的常用的參數(shù)如下:
- i:在重寫一個已經(jīng)存在的文件之前,提示用戶確認(rèn)信息钧忽。 如果不指定這個選項毯炮,mv 命令會默認(rèn)重寫文件內(nèi)容逼肯。
- u:當(dāng)把文件從一個目錄移動另一個目錄時,只是移動不存在的文件桃煎, 或者文件內(nèi)容新于目標(biāo)目錄相對應(yīng)文件的內(nèi)容篮幢。
- v:當(dāng)操作 mv 命令時,顯示翔實的操作信息为迈。
mv 命令的使用示例三椿,請大家練習(xí)使用:
-
mv file1 file2
:移動 file1 到 file2。如果 file2 存在葫辐,它的內(nèi)容會被 file1 的內(nèi)容重寫搜锰。 如果 file2 不存在,則創(chuàng)建 file2耿战。 這兩種情況下蛋叼,file1 都不再存在。 -
mv -i file1 file2
:除了如果 file2 存在的話剂陡,在 file2 被重寫之前狈涮,用戶會得到 提示信息外,這個和上面的選項一樣鸭栖。 -
mv file1 file2 dir1
:移動 file1 和 file2 到目錄 dir1 中歌馍。dir1 必須已經(jīng)存在。 -
mv dir1 dir2
:如果目錄 dir2 不存在晕鹊,創(chuàng)建目錄 dir2骆姐,并且移動目錄 dir1 的內(nèi)容到 目錄 dir2 中,同時刪除目錄 dir1捏题。如果目錄 dir2 存在,移動目錄 dir1(及它的內(nèi)容)到目錄 dir2肉渴。
4. rm
rm 命令用來移除(刪除)文件和目錄:
-
rm item...
:"item" 代表一個或多個文件或目錄公荧。
rm 命令的常用參數(shù)如下:
- i:在刪除已存在的文件前,提示用戶確認(rèn)信息同规。 如果不指定這個選項循狰,rm 會默默地刪除文件
- r:遞歸地刪除文件,這意味著券勺,如果要刪除一個目錄绪钥,而此目錄 又包含子目錄,那么子目錄也會被刪除关炼。要刪除一個目錄程腹,必須指定這個選項。
- f:忽視不存在的文件儒拂,不顯示提示信息寸潦。這選項會使 i 選項失效色鸳。
- v:在執(zhí)行 rm 命令時,顯示翔實的操作信息见转。
rm 命令的使用示例命雀,請大家練習(xí)使用:
-
rm file1
:默默地刪除文件 file1 -
rm -i file1
:除了在刪除文件之前,提示用戶確認(rèn)信息之外斩箫,和上面的命令作用一樣 -
rm -r file1 dir1
:刪除文件 file1,吏砂,目錄 dir1,及 dir1 中的內(nèi)容乘客。 -
rm -rf file1 dir1
:同上狐血,除了如果文件 file1,或目錄 dir1 不存在的話寨典,rm 仍會繼續(xù)執(zhí)行氛雪。
特別注意:
類 Unix 的操作系統(tǒng),比如說 Linux耸成,沒有復(fù)原命令报亩。一旦你用 rm 刪除了一些東西, 它就消失了井氢。
尤其要小心通配符弦追。思考一下這個經(jīng)典的例子。假如說花竞,你只想刪除一個目錄中的 HTML 文件劲件。輸入:rm *.html
這是正確的,如果你不小心在 “*” 和 “.html” 之間多輸入了一個空格约急,就像這樣:rm * .html
這個 rm 命令會刪除目錄中的所有文件零远,還會抱怨沒有文件叫做 ".html"。
小貼士: 當(dāng)你使用帶有通配符的 rm 命令時(除了仔細(xì)檢查輸入的內(nèi)容外)厌蔽, 先用 ls 命令來測試通配符牵辣。這會讓你看到將要被刪除的文件是什么。然后按下上箭頭按鍵奴饮,重新調(diào)用 剛剛執(zhí)行的命令纬向,用 rm 替換 ls。
5. ln
ln 命令既可創(chuàng)建硬鏈接戴卜,也可以創(chuàng)建符號鏈接逾条。可以用其中一種方法來使用它("item" 可以是一個文件或是一個目錄投剥。):
-
ln file link
:創(chuàng)建硬鏈接 -
ln -s item link
:創(chuàng)建符號鏈接
5.1. 硬鏈接
與更加現(xiàn)代的符號鏈接相比师脂,硬鏈接是最初 Unix 創(chuàng)建鏈接的方式。每個文件默認(rèn)會有一個硬鏈接, 這個硬鏈接給予文件名字危彩。我們每創(chuàng)建一個硬鏈接攒磨,就為一個文件創(chuàng)建了一個額外的目錄項。 硬鏈接有兩個重要局限性:
- 一個硬鏈接不能關(guān)聯(lián)它所在文件系統(tǒng)之外的文件汤徽。這是說一個鏈接不能關(guān)聯(lián) 與鏈接本身不在同一個磁盤分區(qū)上的文件娩缰。
- 一個硬鏈接不能關(guān)聯(lián)一個目錄。
一個硬鏈接和文件本身沒有什么區(qū)別谒府。不像符號鏈接拼坎,當(dāng)你列出一個包含硬鏈接的目錄 內(nèi)容時,你會看到?jīng)]有特殊的鏈接指示說明完疫。當(dāng)一個硬鏈接被刪除時泰鸡,這個鏈接 被刪除,但是文件本身的內(nèi)容仍然存在(這是說壳鹤,它所占的磁盤空間不會被重新分配)盛龄, 直到所有關(guān)聯(lián)這個文件的鏈接都刪除掉。知道硬鏈接很重要芳誓,因為你可能有時 會遇到它們余舶,但現(xiàn)在實際中更喜歡使用符號鏈接,下一步我們會討論符號鏈接锹淌。
5.2. 符號鏈接
創(chuàng)建符號鏈接是為了克服硬鏈接的局限性匿值。符號鏈接生效,是通過創(chuàng)建一個 特殊類型的文件赂摆,這個文件包含一個關(guān)聯(lián)文件或目錄的文本指針挟憔。在這一方面, 它們和 Windows 的快捷方式差不多烟号,當(dāng)然绊谭,符號鏈接早于 Windows 的快捷方式 很多年。
一個符號鏈接指向一個文件汪拥,而且這個符號鏈接本身與其它的符號鏈接幾乎沒有區(qū)別龙誊。 例如,如果你往一個符號鏈接里面寫入東西喷楣,那么相關(guān)聯(lián)的文件也被寫入。然而鹤树, 當(dāng)你刪除一個符號鏈接時铣焊,只有這個鏈接被刪除,而不是文件自身罕伯。如果先于符號鏈接 刪除文件曲伊,這個鏈接仍然存在,但是不指向任何東西。在這種情況下坟募,這個鏈接被稱為壞鏈接岛蚤。在許多實現(xiàn)中,ls 命令會以不同的顏色展示壞鏈接懈糯,比如說紅色涤妒,來顯示它們的存在。