-
查看目錄內容
ls
-
切換目錄
cd
-
創建和刪除操作
touch
rm
mkdir
-
拷貝和移動文件
cp
mv
-
查看文件內容
cat
more /less
grep
head/tail
-
確定文件的類型
- file
-
其他
echo
- 重定向
>
和>>
- 管道
|
- 軟鏈接和硬鏈接
01. 查看目錄內容
1.1 ls
命令說明
ls
是英文單詞 list 的簡寫,其功能為列出目錄的內容,是用戶最常用的命令之一,類似於 DOS 下的dir
命令。
Linux 下文件和目錄的特點
- Linux 文件 或者 目錄 名稱最長可以有
256
個字符。 - 以
.
開頭的文件為隱藏文件,需要用 -a 參數才能顯示。 - . 代表當前目錄。
- .. 代表上一級目錄。
1.2 ls 常用選項
參數 | 含義 |
---|---|
-a | 顯示指定目錄下所有子目錄與文件,包括隱藏文件 |
-l | 以列表方式顯示文件的詳細信息 |
-h | 配合 -l 以人性化的方式顯示文件大小 |
計算機中文件大小的表示方式(科普)
單位 | 英文 | 含義 |
---|---|---|
字節 | B(Byte) | 在計算機中作為一個數字單元,一般為 8 位二進制數 |
千 | K(Kibibyte) | 1 KB = 1024 B,千字節 (1024 = 2 ** 10) |
兆 | M(Mebibyte) | 1 MB = 1024 KB,百萬字節 |
千兆 | G(Gigabyte) | 1 GB = 1024 MB,十億字節,千兆字節 |
太 | T(Terabyte) | 1 TB = 1024 GB,萬億字節,太字節 |
拍 | P(Petabyte) | 1 PB = 1024 TB,千萬億字節,拍字節 |
艾 | E(Exabyte) | 1 EB = 1024 PB,百億億字節,艾字節 |
澤 | Z(Zettabyte) | 1 ZB = 1024 EB,十萬億億字節,澤字節 |
堯 | Y(Yottabyte) | 1 YB = 1024 ZB,一億億億字節,堯字節 |
1.3 ls中通配符的使用
因為 shell 頻繁地使用文件名,shell 提供了特殊字符來幫助你快速指定一組文件名。這些特殊字符叫做通配符。 使用通配符允許你依據字符類型來選擇文件名。下表列出這些通配符以及它們所選擇的對象:
通配符 | 含義 |
---|---|
* | 代表任意個數個字符 |
? | 代表任意一個字符,至少 1 個 |
[] | 表示可以匹配字符組中的任何一個 |
[abc] | 匹配 a、b、c 中的任意一個 |
[a-f] | 匹配從 a 到 f 范圍內的的任意一個字符 |
[!abc] | 匹配任意一個不是字符集中的字符 |
[[:class:]] | 匹配任意一個屬於指定字符類中的字符 |
經常使用的字符類如下表:
字符類 | 意義 |
---|---|
[:alnum:] | 匹配任意一個字母或數字 |
[:alpha:] | 匹配任意一個字母 |
[:digit:] | 匹配任意一個數字 |
[:lower:] | 匹配任意一個小寫字母 |
[:upper:] | 匹配任意一個大寫字母 |
借助通配符,為文件名構建非常復雜的選擇標准成為可能。下面是一些類型匹配的范例:
模式 | 匹配對象 |
---|---|
* | 所有文件 |
g* | 文件名以“g”開頭的文件 |
b*.txt | 以"b"開頭,中間有零個或任意多個字符,並以".txt"結尾的文件 |
Data??? | 以“Data”開頭,其后緊接着3個字符的文件 |
[abc]* | 文件名以"a","b",或"c"開頭的文件 |
[[:upper:]]* | 以大寫字母開頭的文件 |
[![:digit:]]* | 不以數字開頭的文件 |
*[[:lower:]123] | 文件名以小寫字母結尾,或以 “1”,“2”,或 “3” 結尾的文件 |
課堂練習:
(base) root@w:/home/w# ls 公共的 視頻 文檔 音樂 anzhuangbao PycharmProjects watchlist 模板 圖片 下載 桌面 prac_code snap wendu (base) root@w:/home/w# ls 公共的 視頻 文檔 音樂 anzhuangbao PycharmProjects watchlist 模板 圖片 下載 桌面 prac_code snap wendu base) root@w:/bin# ls aa* aa-enabled aa-exec (base) root@w:/bin# ls zip???? zipgrep zipinfo zipnote (base) root@w:/bin# ls [[:upper:]]* GET HEAD POST X Xephyr Xorg Xwayland X11: '[' mmove 2to3-2.7 mokutil
通配符里更多的高級知識我們在后面高級課程里的正則表達式里面來講。
02. 切換目錄
2.1 cd
cd
是英文單詞 change directory 的簡寫,其功能為更改當前的工作目錄,也是用戶最常用的命令之一。
注意:Linux 所有的 目錄 和 文件名 都是大小寫敏感的。
命令 | 含義 |
---|---|
cd | 切換到當前用戶的主目錄(/home/用戶目錄) |
cd ~ | 切換到當前用戶的主目錄(/home/用戶目錄) |
cd . | 保持在當前目錄不變 |
cd .. | 切換到上級目錄 |
cd - | 可以在最近兩次工作目錄之間來回切換 |
2.2 相對路徑和絕對路徑
- 相對路徑 在輸入路徑時,最前面不是 / 或者 ~,表示相對 當前目錄 所在的目錄位置。
- 絕對路徑 在輸入路徑時,最前面是 / 或者 ~,表示從 根目錄/家目錄 開始的具體目錄位置。
課堂練習:練習上面的cd的快捷方式,熟記;
03. 創建和刪除操作
3.1 touch
- 創建文件或修改文件時間。
- 如果文件 不存在,可以創建一個空白文件。
- 如果文件 已經存在,可以修改文件的末次修改日期。
3.2 mkdir
- 創建一個新的目錄
選項 | 含義 |
---|---|
-p | 可以遞歸創建目錄 |
新建目錄的名稱 不能與當前目錄中 已有的目錄或文件 同名。
mkdir -p parent/son
。
3.3 rm
- 刪除文件或目錄。
選項 | 含義 |
---|---|
-f | 強制刪除,忽略不存在的文件,無需提示 |
-r | 遞歸地刪除目錄下的內容,刪除文件夾 時必須加此參數 |
小心 rm!(你一定要知道的)
類 Unix 的操作系統,比如說 Linux,沒有復原命令。一旦你用 rm 刪除了一些東西, 它就消失了。Linux 假定你很聰明,你知道你在做什么。
尤其要小心通配符。思考一下這個經典的例子。假如說,你只想刪除一個目錄中的 HTML 文件。輸入:
rm *.html
這是正確的,如果你不小心在 * 和 “.html” 之間多輸入了一個空格,就像這樣:rm * .html
這個 rm 命令會刪除目錄中的所有文件,還會抱怨沒有文件叫做 “.html”。
小貼士。 無論什么時候,rm 命令用到通配符(除了仔細檢查輸入的內容外!), 用 ls 命令來測試通配符。這會讓你看到要刪除的文件列表。然后按下上箭頭按鍵,重新調用 剛剛執行的命令,用 rm 替換 ls。
04. 拷貝和移動文件
序號 | 命令 | 對應英文 | 作用 |
---|---|---|---|
01 | tree [目錄名] | tree | 以樹狀圖列出文件目錄結構 |
02 | cp 源文件 目標文件 | copy | 復制文件或者目錄 |
03 | mv 源文件 目標文件 | move | 移動文件或者目錄/文件或者目錄重命名 |
4.1 tree
tree
命令可以樹狀圖列出文件目錄結構。
選項 | 含義 |
---|---|
-d | 只顯示目錄 |
(base) root@w:/home/w/anzhuangbao# tree
.
├── dd_for_ubuntu.zip
├── libpango-1.0-0_1.40.14-1ubuntu0.1_amd64.deb
├── libpangocairo-1.0-0_1.40.14-1ubuntu0.1_amd64.deb
└── libpangoft2-1.0-0_1.40.14-1ubuntu0.1_amd64.deb
0 directories, 4 files
4.2 cp
cp
命令的功能是將給出的 文件 或 目錄 復制到另一個 文件 或 目錄 中,相當於 DOS 下的copy
命令。
這里列舉了 cp 命令一些有用的選項(短選項和等效的長選項)
選項 | 意義 |
---|---|
-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 中。 |
4.3 mv
mv
命令可以用來 移動 文件 或 目錄,也可以給 文件或目錄重命名。
選項 | 含義 |
---|---|
-i | 覆蓋文件前提示 |
-u | 當把文件從一個目錄移動另一個目錄時,只是移動不存在的文件, 或者文件內容新於目標目錄相對應文件的內容 |
-v | 當操作 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。 |
05. 查看文件內容
序號 | 命令 | 對應英文 | 作用 |
---|---|---|---|
01 | cat 文件名 | concatenate | 查看文件內容、創建文件、文件合並、追加文件內容等功能 |
02 | more 文件名 | more | 分屏顯示文件內容 |
03 | grep 搜索文本 文件名 | grep | 搜索文本文件內容 |
5.1 cat
cat
命令可以用來 查看文件內容、創建文件、文件合並、追加文件內容 等功能。cat
會一次顯示所有的內容,適合 查看內容較少 的文本文件。
選項 | 含義 |
---|---|
-b | 對非空輸出行編號 |
-n | 對輸出的所有行編號 |
Linux 中還有一個
nl
的命令和cat -b
的效果等價。
5.2 more
和less
more
命令可以用於分屏顯示文件內容,每次只顯示一頁內容。- 適合於 查看內容較多的文本文件。
使用 more
的操作鍵:
操作鍵 | 功能 |
---|---|
空格鍵 | 顯示手冊頁的下一屏 |
Enter 鍵 | 一次滾動手冊頁的一行 |
b | 回滾一屏 |
f | 前滾一屏 |
q | 退出 |
/word | 搜索 word 字符串 |
5.3 grep - 打印匹配行
grep 是個很強大的程序,用來找到文件中的匹配文本。這樣使用 grep 命令:
grep pattern [file...]
當 grep 遇到一個文件中的匹配”模式”,它會打印出包含這個類型的行。grep 能夠匹配的模式可以 很復雜,但是現在我們把注意力集中在簡單文本匹配上面。在后面的高級課程中,我們將會研究高級模式,叫做正則表達式。
比如說,我們想在我們的程序列表中,找到文件名中包含單詞”zip”的所有文件。這樣一個搜索, 可能讓我們了解系統中的一些程序與文件壓縮有關系。這樣做:
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
gunzip
...
grep 有-對方便的選項:”-i”導致 grep 忽略大小寫當執行搜索時(通常,搜索是大小寫敏感的),”-v”選項會告訴 grep 只打印不匹配的行。
5.4 head / tail - 打印文件開頭部分/結尾部分
有時候你不需要一個命令的所有輸出。可能你只想要前幾行或者后幾行的輸出內容。 head 命令打印文件的前十行,而 tail 命令打印文件的后十行。默認情況下,兩個命令 都打印十行文本,但是可以通過”-n”選項來調整命令打印的行數。
[me@linuxbox ~]$ head -n 5 ls-output.txt
total 343496
...
[me@linuxbox ~]$ tail -n 5 ls-output.txt
...
它們也能用在管道線中:
[me@linuxbox ~]$ ls /usr/bin | tail -n 5
znew
...
6.確定文件的類型
隨着探究操作系統的進行,知道文件包含的內容是很有用的。我們將用 file 命令來確定文件的類型。我們之前討論過,在 Linux 系統中,並不要求文件名來反映文件的內容。然而,一個類似 “picture.jpg” 的文件名,我們會期望它包含 JPEG 壓縮圖像,但 Linux 卻不這樣要求它。可以這樣調用 file 命令:
file filename
當調用 file 命令后,file 命令會打印出文件內容的簡單描述。例如:
[me@linuxbox ~]$ file picture.jpg
picture.jpg: JPEG image data, JFIF standard 1.01
有許多種類型的文件。事實上,在類 Unix 操作系統中比如說 Linux 中,有個普遍的觀念就是“一切皆文件”。
07. 其他
7.1 echo 文字內容
echo
會在終端中顯示參數指定的文字,通常會和 重定向 聯合使用。
7.2 重定向 >
和 >>
- Linux 允許將命令執行結果 重定向到一個 文件。
- 將本應顯示在終端上的內容 輸出/追加 到指定文件中。
其中
>
表示輸出,會覆蓋文件原有的內容。>>
表示追加,會將內容追加到已有文件的末尾。
7.3 管道 |
- Linux 允許將 一個命令的輸出 可以通過管道 做為 另一個命令的輸入。
- 可以理解現實生活中的管子,管子的一頭塞東西進去,另一頭取出來,這里
|
的左右分為兩端,左端塞東西(寫),右端取東西(讀)。
常用的管道命令有:
more
:分屏顯示內容。grep
:在命令執行結果的基礎上查詢指定的文本。
ll /usr/bin |less
ls /bin /usr/bin | sort | less
:因為我們指定了兩個目錄(/bin 和/usr/bin),ls 命令的輸出結果由兩個有序列表組成, 各自針對一個目錄。通過在管道線中包含 sort,我們改變輸出數據,從而產生一個 有序列表。
ls /bin /usr/bin | sort | uniq | wc -l
ls /bin /usr/bin | sort | uniq | grep zip
7.4 硬鏈接和軟鏈接
- 硬鏈接
硬鏈接是最初 Unix 創建鏈接的方式,而軟鏈接接更加現代。 在默認情況下,每個文件有一個硬鏈接,這個硬鏈接給文件起名字。當我們創建一個硬鏈接以后,就為文件創建了一個額外的目錄條目。但硬鏈接有兩個重要局限性:
- 一個硬鏈接不能關聯它所在文件系統之外的文件。這是說一個鏈接不能關聯 與鏈接本身不在同一個磁盤分區上的文件。
- 一個硬鏈接不能關聯一個目錄。
一個硬鏈接和文件本身沒有什么區別,不像軟鏈接,當你列出一個包含硬鏈接的目錄內容時,你會看到沒有特殊的鏈接指示說明。當一個硬鏈接被刪除時,這個鏈接被刪除,但是文件本身的內容仍然存在(這是說,它所占的磁盤空間不會被重新分配),直到所有關聯這個文件的鏈接都刪除掉。知道硬鏈接很重要,因為你可能有時會遇到它們,但現在實際中更喜歡使用符號鏈接。
創建硬鏈接:
ln file link
- 軟鏈接
軟鏈接,又稱為符號鏈接,像這樣的一條信息:
lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so
注意看,為何這條信息第一個字符是“l”,硬鏈接文件沒有,並且有兩個文件名呢? 這是一個特殊文件,叫做符號鏈接(也稱為軟鏈接或者 symlink )。 在大多數“類 Unix” 系統中, 有可能一個文件被多個文件名所指向。雖然這種特性的意義並不明顯,但它真地很有用。創建符號鏈接是為了克服硬鏈接的局限性。軟鏈接和 Windows 的快捷方式差不多,當然,符號鏈接早於 Windows 的快捷方式 很多年。
一個符號鏈接指向一個文件,而且這個符號鏈接本身與其它的符號鏈接幾乎沒有區別。 例如,如果你往一個符號鏈接里面寫入東西,那么相關聯的文件也被寫入。然而, 當你刪除一個符號鏈接時,只有這個鏈接被刪除,而不是文件自身。如果先於符號鏈接刪除文件,這個鏈接仍然存在,但是不指向任何東西。在這種情況下,這個鏈接被稱為 壞鏈接。在許多實現中,ls 命令會以不同的顏色展示壞鏈接,比如說紅色,來顯示它們的存在。
創建軟鏈接:
ln -s item link
,”item” 可以是一個文件或是一個目錄。
序號 | 命令 | 作用 |
---|---|---|
01 | ln -s 被鏈接的源文件 鏈接文件 | 建立文件的軟鏈接,用通俗的方式講類似於 Windows 下的快捷方式 |
-
注意:
-
\1. 沒有
-s
選項建立的是一個 硬鏈接文件- 兩個文件占用相同大小的硬盤空間,工作中幾乎不會建立文件的硬鏈接
-
\2. 源文件要使用絕對路徑,不能使用相對路徑,這樣可以方便移動鏈接文件后,仍然能夠正常使用
軟鏈接演練:
- 新建
01.py
。 - 將當前目錄下的
01.py
移動到 當前目錄下demo/b/c
目錄下。- 使用 相對路徑 和 絕對路徑 分別建立
01.py
的軟鏈接firstpython和firstpython1。
- 使用 相對路徑 和 絕對路徑 分別建立
- 將
firstpython
和firstpython1 移動到demo
目錄下,對比使用 相對路徑 和 絕對路徑 的區別。
硬鏈接演練:
- 建立01.py的硬鏈接 01_hard,02_hard。
- 使用
ls -l
查看文件的硬鏈接數。 - 刪除 01.py,並且使用 tree來確認 demo目錄下的三個鏈接文件。