---
# System prepended metadata

title: 第五堂課，為了活用shell script所以繼續來說linux

---

# 第五堂課，為了活用shell script所以繼續來說linux
在上個禮拜，我們學習了bash的一些基本命令，但實際上它並不是設計出來解決apcs題目的（apcs也不收）。它設計的用途是為了我們方便做系統管理，所以這次我們就來看看它與一般程式語言的不同處吧。
## 在檔案系統中遨遊
```
[john@localnet ~]$ 
```
在命令行的這個提示字元裡有一個「~」，這個就是你現在所在的目錄，會隨著你在檔案系統中移動而有所改變。
而上一次我們有說「~」代表的是家目錄，其他還有一些代表目錄的特殊字元如下：
\.         #代表此層目錄
.\.   #代表上一層目錄
\-         #代表前一個工作目錄
\~         #代表『目前使用者身份』所在的家目錄
\~account  #代表 account 這個使用者的家目錄(account是個帳號名稱)

對於目錄來說有重要幾個指令：ls(檢視檔案與目錄)、cd（變換目錄）、pwd（顯示目前的目錄）、mkdir（建立一個新的目錄）和rmdir（刪除一個空的目錄）。他們的用法如下：
```
ls [-aAdfFhilnrRSt] 檔名或目錄名稱..
-a  ：全部的檔案，連同隱藏檔( 開頭為 . 的檔案) 一起列出來(常用)
-A  ：全部的檔案，連同隱藏檔，但不包括 . 與 .. 這兩個目錄
-d  ：僅列出目錄本身，而不是列出目錄內的檔案資料(常用)
-f  ：直接列出結果，而不進行排序 (ls 預設會以檔名排序！)
-F  ：根據檔案、目錄等資訊，給予附加資料結構，例如：
      *:代表可執行檔； /:代表目錄； =:代表 socket 檔案； |:代表 FIFO 檔案；
-h  ：將檔案容量以人類較易讀的方式(例如 GB, KB 等等)列出來(常用)；
-l  ：長資料串列出，包含檔案的屬性與權限等等資料；(常用)
-r  ：將排序結果反向輸出，例如：原本檔名由小到大，反向則為由大到小；
-R  ：連同子目錄內容一起列出來，等於該目錄下的所有檔案都會顯示出來；
-S  ：以檔案容量大小排序，而不是用檔名排序；
-t  ：依時間排序，而不是用檔名。
```
所以說，我們比較常會碰到的是：
```
ls -alh #列出檔案和目錄
或
ls -aldh #列出現在所在的目錄本身

[john@localnet ~]$ ls -alh
drwx------ 31 john john 4.0K  5月  2 15:24 .
drwxr-xr-x  3 root root 4.0K  1月 25 21:33 ..
drwxr--r--  2 john john 4.0K  1月 25 22:02 .att_backups
-rw-------  1 john john  12K  4月 28 08:01 .bash_history
-rw-r--r--  1 john john   21 12月 21 02:44 .bash_logout
-rw-r--r--  1 john john   57 12月 21 02:44 .bash_profile
-rw-r--r--  1 john john 7.0K  1月 25 21:51 .bashrc
-rw-r--r--  1 john john  141 12月 21 02:44 .bashrc-old
drwxr-xr-x 43 john john 4.0K  5月  2 17:13 .cache
drwxr-xr-x  3 john john 4.0K  3月 28 13:24 .cargo
drwx------  2 john john 4.0K  5月  2 17:31 .chewing
drwxr-xr-x 48 john john 4.0K  5月  2 17:24 .config
...
```
知道了現在所在位置可見的檔案和目錄，我們就能使用cd:
```
cd [相對路徑（ls輸出結果，現在所在位置當起點的目錄，如.cache）]
或
cd [絕對路徑(根目錄當起點的目錄，如/home/john/.cache)]

[john@localnet ~]$ cd .cache/
[john@localnet .cache]$ 
```
而pwd相當簡單：
```
[john@localnet .cache]$ pwd
/home/john/.cache
```
而mkdir也是很直覺：
```
mkdir [-mp] 目錄名稱
選項與參數：
-m ：設定檔案的權限喔！直接設定，不需要看預設權限 (umask) 的臉色～
-p ：幫助你直接將所需要的目錄(包含上層目錄)遞迴建立起來！

[john@localnet 下載]$ mkdir test1
[john@localnet 下載]$ mkdir -p test3/test4
[john@localnet 下載]$ ls -alh
drwxr-xr-x  4 john john 4.0K  5月  2 17:47 .
drwx------ 31 john john 4.0K  5月  2 15:24 ..
drwxr-xr-x  2 john john 4.0K  5月  2 17:47 test1
drwxr-xr-x  3 john john 4.0K  5月  2 17:47 test3
[john@localnet 下載]$ cd test3/
[john@localnet test3]$ ls -alh
drwxr-xr-x 3 john john 4.0K  5月  2 17:47 .
drwxr-xr-x 4 john john 4.0K  5月  2 17:47 ..
drwxr-xr-x 2 john john 4.0K  5月  2 17:47 test4
```
而用rmdir刪除的目錄裡面不能存在其他的目錄或檔案：
```
rmdir [-p] 目錄名稱
選項與參數：
-p ：連同『上層』『空的』目錄也一起刪除

[john@localnet 下載]$ rmdir test1
[john@localnet 下載]$ ls -alh
drwxr-xr-x  4 john john 4.0K  5月  2 17:47 .
drwx------ 31 john john 4.0K  5月  2 15:24 ..
drwxr-xr-x  3 john john 4.0K  5月  2 18:00 test3

[john@localnet 下載]$ rmdir -p test3/test4
或
[john@localnet 下載]$ rmdir test3/test4
[john@localnet 下載]$ rmdir test3
的結果都是一樣的
[john@localnet 下載]$ ls -alh
drwxr-xr-x  4 john john 4.0K  5月  2 17:47 .
drwx------ 31 john john 4.0K  5月  2 15:24 ..
```

## 關於檔案

對於檔案來說有重要幾個指令：cp(複製檔案或目錄)、rm (移除檔案或目錄)、和mv(移動檔案與目錄，或更名)。他們的用法如下：
```
cp [-adfilprsu] 來源檔(source) 目標檔(destination)
選項與參數：
-a  ：相當於 -dr --preserve=all 的意思，也就是保留包含存取更改時間和權限等所有
      屬性的完全複製；(常用)
-d  ：若來源檔為連結檔的屬性(link file)，則複製連結檔屬性而非檔案本身；
-f  ：為強制(force)的意思，若目標檔案已經存在且無法開啟，則移除後再嘗試一次；
-i  ：若目標檔(destination)已經存在時，在覆蓋時會先詢問動作的進行(常用)
-l  ：進行硬式連結(hard link)的連結檔建立，而非複製檔案本身；
-p  ：連同檔案的屬性(權限、用戶、時間)一起複製過去，而非使用預設屬性(備份常用)；
-r  ：遞迴持續複製，用於目錄的複製行為；(常用)
-s  ：複製成為符號連結檔 (symbolic link)，亦即『捷徑』檔案；

[john@localnet 下載]$ cp test.txt text3
[john@localnet 下載]$ cd test3/
[john@localnet test3]$ ls -alh
drwxr-xr-x 3 john john 4.0K  5月  2 18:26 .
drwxr-xr-x 5 john john 4.0K  5月  2 18:26 ..
drwxr-xr-x 2 john john 4.0K  5月  2 18:00 test4
-rw-r--r-- 1 john john    2  5月  2 18:26 test.txt
[john@localnet test3]$ cd ..
[john@localnet 下載]$ cp -r test3 test5
[john@localnet 下載]$ cd test5/
[john@localnet test5]$ ls -alh
drwxr-xr-x 3 john john 4.0K  5月  2 18:29 .
drwxr-xr-x 5 john john 4.0K  5月  2 18:29 ..
drwxr-xr-x 2 john john 4.0K  5月  2 18:29 test4
-rw-r--r-- 1 john john    2  5月  2 18:29 test.txt
[john@localnet test5]$ cd ..
[john@localnet 下載]$ cp -ra test3 test6
[john@localnet 下載]$ cd test6/
[john@localnet test6]$ ls -alh
drwxr-xr-x 3 john john 4.0K  5月  2 18:26 .
drwxr-xr-x 6 john john 4.0K  5月  2 18:31 ..
drwxr-xr-x 2 john john 4.0K  5月  2 18:00 test4
-rw-r--r-- 1 john john    2  5月  2 18:26 test.txt
```
rm
```
rm [-fir] 檔案或目錄
選項與參數：
-f  ：就是 force 的意思，忽略不存在的檔案，不會出現警告訊息；
-i  ：互動模式，在刪除前會詢問使用者是否動作
-r  ：遞迴刪除啊！最常用在目錄的刪除了，這是非常危險的選項

[john@localnet 下載]$ sudo rm -r / #刪掉你的整個系統（超好玩）
[john@localnet 下載]$ rm test.txt
[john@localnet 下載]$ ls -alh
drwxr-xr-x  6 john john 4.0K  5月  2 18:39 .
drwx------ 31 john john 4.0K  5月  2 15:24 ..
drwxr-xr-x  2 john john 4.0K  5月  2 17:47 test1
-rw-r--r--  1 john john    2  5月  2 18:39 test1.txt
-rw-r--r--  1 john john    2  5月  2 18:39 test2.txt
drwxr-xr-x  3 john john 4.0K  5月  2 18:26 test3
drwxr-xr-x  3 john john 4.0K  5月  2 18:29 test5
drwxr-xr-x  3 john john 4.0K  5月  2 18:26 test6
[john@localnet 下載]$ rm test*
rm: 無法刪除 'test1': 是個目錄
rm: 無法刪除 'test3': 是個目錄
rm: 無法刪除 'test5': 是個目錄
rm: 無法刪除 'test6': 是個目錄
[john@localnet 下載]$ ls -alh
drwxr-xr-x  6 john john 4.0K  5月  2 18:40 .
drwx------ 31 john john 4.0K  5月  2 15:24 ..
drwxr-xr-x  2 john john 4.0K  5月  2 17:47 test1
drwxr-xr-x  3 john john 4.0K  5月  2 18:26 test3
drwxr-xr-x  3 john john 4.0K  5月  2 18:29 test5
drwxr-xr-x  3 john john 4.0K  5月  2 18:26 test6
```
mv
```
mv [-fiu] source destination
選項與參數：
-f  ：force 強制的意思，如果目標檔案已經存在，不會詢問而直接覆蓋；
-i  ：若目標檔案 (destination) 已經存在時，就會詢問是否覆蓋！
-u  ：若目標檔案已經存在，且 source 比較新，才會更新 (update)

[john@localnet 下載]$ mv test.txt test1
[john@localnet 下載]$ cd test1/
[john@localnet test1]$ ls -alh
drwxr-xr-x 2 john john 4.0K  5月  2 18:45 .
drwxr-xr-x 6 john john 4.0K  5月  2 18:45 ..
-rw-r--r-- 1 john john    2  5月  2 18:45 test.txt
[john@localnet test1]$ cd ..
[john@localnet 下載]$ mv test1 test2
[john@localnet 下載]$ ls -alh
drwxr-xr-x  6 john john 4.0K  5月  2 18:47 .
drwx------ 31 john john 4.0K  5月  2 15:24 ..
drwxr-xr-x  2 john john 4.0K  5月  2 18:45 test2
drwxr-xr-x  3 john john 4.0K  5月  2 18:26 test3

[john@localnet 下載]$ mv test1.txt test2.txt test2
[john@localnet 下載]$ cd test2/
[john@localnet test2]$ ls -alh
drwxr-xr-x 2 john john 4.0K  5月  2 18:49 .
drwxr-xr-x 6 john john 4.0K  5月  2 18:49 ..
-rw-r--r-- 1 john john    2  5月  2 18:48 test1.txt
-rw-r--r-- 1 john john    2  5月  2 18:48 test2.txt
-rw-r--r-- 1 john john    2  5月  2 18:45 test.txt
```

### 參考資料＆延伸學習
http://linux.vbird.org/linux_basic/0220filemanager.php#cprmmv
## 練習：來看看PKGBUILD吧！