Unix Command
DOS Command
老師介紹了幾個常用的 DOS Command,但我覺得漏了一件最重要的事:你不記得指令後方參數時,該怎麼辦?
答案很簡單,在指令後方加上 /?
即可。
以 cd
為例:
C:\>cd/?
顯示目前工作目錄的名稱或是變更目錄。
CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]
.. 指定變更到上層目錄。
輸入 CD drive: 即可顯示指定磁碟機的目前工作目錄。
僅輸入 CD 而不加參數,即可顯示目前的磁碟機和目錄。
使用 /D 參數可以同時變更工作磁碟機及其工作目錄。
如果您啟用擴充命令,CHDIR 的變更如下:
目前的目錄字串會被轉換成與磁碟上名稱相同大小寫的字串。
所以如果磁碟上的目錄是 C:\Temp 的話,CD C:\TEMP 命令實
際上會轉換為 CD C:\Temp。
CHDIR 命令不會將空格當成分隔字元,所以如果您要切換到含
有空白字元的目錄時,就算您不使用引號來括住目錄名稱,也
一樣可以用 CD 命令切換到該目錄。例如:
cd \winnt\profiles\username\programs\start menu
就相等於:
cd "\winnt\profiles\username\programs\start menu"
如果您停用擴充命令,就必須輸入前一種命令。
不過這個說明,我覺得還不夠。雖然介紹了 cd..
(cd
和 ..
之間,可以不用有空白),卻沒介紹 cd\
(切換到該磁碟的的最上層)。
Q. 如果你要切換的路徑,有亂碼或太長的時候怎麼辦?
A. 你可以用 檔案總管(File Explorer) 上方 List Box 中的路徑來編輯(複製 ctrl + c、貼上 ctrl + v),速度會快得多。
這裡是 DOS Command 的速查表,除了老師提到的之外,再加上幾個比較常用的指令。
DOS Command | 範例 | 用途 |
---|---|---|
help | help | 叫出所有可用的 DOS Command |
/? | /? | 叫出該指令(上述 help 可列出所有指令)的線上說明 |
dir/? | 叫出 dir 指令的線上說明 | |
cd | cd | chdir - change directory 切換到不同的路徑 |
以這個路徑為例 C:\Dev\Study\JS> | ||
cd… | 到上一層路徑 C:\Dev\Study> | |
cd\ | 到最上層路徑 C:\ > | |
cd 路徑名 | 到下一層路徑(路徑名) | |
cd\路徑名 | 直接切換到到指定路徑 C:.…\路徑名 > | |
cd Dev | 到下一層路徑(路徑名) C:\Dev> | |
dir | dir | 顯示本路徑中,所有的檔案 |
dir/on | on name 顯示本路徑中,所有的檔案,依檔案字母順序排列 | |
dir/od | on date 依檔案日期/時間(日期較早的在前) | |
dir/o-d | on -date 依檔案日期/時間(日期較早的在後) | |
dir/oe | on extension 依檔案副檔名(字母順序) | |
dir/ox | 顯示非 8.3 格式檔案的短檔名 | |
dir *.py | 萬用字元 *,本例為顯示所有副檔名為 py 的檔案 | |
dir m*.py | 萬用字元 *,本例為顯示所有主檔名第一個字母為 m 的 py 檔 | |
dir mai?.py | 替代字元 ?,本例為顯示所有主檔名前三個字母為 mai ,第四字母不限的 py 檔 | |
md | md | mkdir - make directory 建立新的子路徑 |
cls | cls | clear screen 清除目前螢幕上所有文字 |
ren | ren | rename 重新命名 |
exit | exit | exit 結束 DOS Command |
↑ | 鍵盤上的向上箭頭,可叫出之前輸入的指令 | |
↓ | 鍵盤上的向下箭頭,可叫出之後輸入的指令 | |
tab | auto complete 鍵盤上的 tab 鍵(Q的左邊),可自動呼叫最接近目前輸入文字的路徑 | |
tab | cd Sttab | 由 C:\Dev>cd St 變成 C:\Dev>cd Study |
date | date | 顯示今天日期,若要修改,可輸入新日期 |
time | time | 顯示目前時間,若要修改,可輸入新時間 |
del | del | delete 刪除檔案,可和萬用字元 * 替代字元 ? 搭配使用 |
del *.py | 刪除目前路徑下的所有 Python 檔案 | |
rmdir | rmdir temp | 刪除 temp 路徑(如路徑內含檔案,需另行處理) |
echo | echo [ON | OFF] |
echo [message] | 顯示訊息 | |
echo | 僅輸入 ECHO 而不加上參數,可以顯示目前的 ECHO 設定 | |
copy | copy *.py d:\temp | 將目前路徑中所有的 Python 檔,複製到 D:\Temp 下 |
move | move *.py d:\temp | 將目前路徑中所有的 Python 檔,移動到 D:\Temp 下 |
type | type readme.txt | 顯示文字檔的內容 |
path | path | 顯示 OS 環境路徑參數設定。在 path 設定路徑中的可執行檔(exe, bat…),執行時不用先移動至該路徑 |
你可以想像成:哆啦A夢的任意門 | ||
> | > filename | 將原本要顯示在螢幕上的結果,輸出到指定檔案(文字格式) |
dir/on *.py > py.txt | 將所有 Python 檔案,依檔名字母排序後,寫入 py.txt |
DOS Batch
談到 DOS Command,如果不提 Batch file(*.bat),那只發揮了五成的功力。
因為本課程中未提及,我只附上參考文章,請感興趣的朋友,自行閱讀。
這裡附上我寫爬蟲時,所使用的 Batch file(go.bat 使用時會加日期當參數),節錄部分給大家參考。
d:
cd\Dropbox\Udemy\Temp\udemy05
scrapy crawl uspider05 -o ..\today-%1.csv
cd\Dropbox\Udemy\Temp\udemy11
scrapy crawl uspider11 -o ..\today-%1.csv
REM ===== 省略幾個爬蟲 =====
copy ..\today-%1.csv C:\Dev\Study\daily01\data\crawl_today_2022_%1.csv
move ..\today-%1.csv D:\Dropbox\Udemy
REM ===== Run Daily01.py directly from DOS COMMAND =====
c:
cd\Dev\Study\daily01
main.py
IF EXIST C:\Dev\Study\daily01\data\all_courses_2022_%1.txt (
copy C:\Dev\Study\daily01\data\all_courses_2022_%1.txt D:\Dropbox\Crawl\Backup\ /y
)
影片中,老師每次專案開始前,都做一樣的事,新增空白檔案:index.html、app.js,建立子目錄 styles 後,新增 style.scss。
這種事情最適合用 Batch file 來處理。
以下這個 bat 檔,會接收你自行命名的參數,當作專案目錄,然後所有事自動搞定。我把這個檔案,放在 path 中的某路徑,這樣在任何地方,都可以執行。
REM ===== 指令範例(go.bat 為例,建立目錄名為 project 的專案 ) >go project =====
md %1
cd %1
type nul > index.html
type nul > app.js
md styles
cd styles
type nul > style.scss
cd..
cd..
code %1
Unix Command
最近有點忙,直接列出來,有空再編輯為表格。資料來源在本節下方,節錄部分我覺得比較常用的指令。
[控制鍵]
Ctrl-U 刪除整行命令行
Ctrl-W 刪除命令行的最後一個字(Word)
Ctrl-C 中斷程式或 shell script
Ctrl-Z 暫停程式或 shell script
Ctrl-S 暫停往下顯示
Ctrl-Q 繼續往下顯示
Ctrl-O 不要程式的輸出, 但不中斷程式
Ctrl-D 終止檔案輸入(EOF), 或 Logout
Ctrl-L 清除畫面
上/下箭頭 重現之前的指令
與檔案目錄有關的特殊字元
. 現在目錄 (一個句點)
… 上一層目錄 (兩個句點)
~ User 之主目錄 (老鼠尾巴)
? 檔名之單一字元 (問號)
- 檔名之所有字元 (星號)
以下摘錄 unix 較常用之命令, 其中也包含了部份 csh 之 Built-in commnad :
ls 顯示目錄內容, 同 DOS 之 DIR - list
ls -al 詳細顯示此目錄內的所有檔案 (包含以 . 開頭之隱藏檔)
ls *.c 顯示此目錄內的所有結尾為 .c 的檔案 (unix 無所謂附檔名)
cd切換目錄 - change directory
cd 切換目錄至您的主目錄
cd … 切換目錄至上一層目錄
cd /usr/bin 切換目錄至 /usr/bin
pwd 顯示現在目錄的路徑 print working directory
mkdir 建一子目錄 make directory
mkdir prg 在現目錄下建一子目錄 prg
mkdir prg/c 在子目錄 prg 下建一子目錄 c
rmdir 刪除一子目錄 remove directory
rmdir prg 刪除子目錄 prg , 但 prg 須為空目錄
file 顯示檔案型態
file * 顯示目錄內所有的檔案型態
cp 拷貝檔案
cp /usr/skel/* . 將 /usr/skel下的所有檔案拷貝至現目錄下, 不包括子目錄
及隱藏檔 cp -r /usr/demo . 將 /usar/demo 下的檔案及子目錄拷貝至現目錄下
chmod 改變檔案許可權
chmod u+x main 將檔案 main 加上自己可執行的許可
chmod 744 main 將檔案 main 變為自己可讀寫可執行, 別人只可讀
rm 刪除檔案
rm abc 刪除檔案 abc
rm -r c 刪除目錄 c 及其下之檔案和子目錄
rm -rf c 同 rm -r c , 但刪除時將不再一一詢問是否刪除.
mv 搬移檔案
mv * …/prg 將所有檔案移至上層目錄之子目錄 prg 下
passwd 更改密碼
clear 清除終端機螢幕
date 顯示日期(可以特殊日期格式顯示)
env 顯示目前所有的環境變數
setenv 指定變數值於 shell 中, 供子 shell 使用
setenv LD_LIBRARY_PATH /usr/openwin/lib
find 找尋檔案
find . -atime +7 -print 找尋現目錄下的所有子目錄及檔案, 其最後一次讀取
為 7 天以上者
find /usr -name “*.h” -print 找尋 /usr下的所有子目錄及檔案, 其檔名為
.h結尾者
gzip 壓縮軟體 GNU zip.
gzip aaa.tar 把 aaa.tar 壓成 aaa.tar.gz
gzip -d aaa.tar.gz 把 aaa.tar.gz 解壓成 aaa.tar
tar 產生或解開檔案庫
tar -cvf bin.tar ./bin 將 ./bin 下之檔案及其子目錄製成一檔案庫 bin.tar
tar -xvf bin.tar 將檔案庫 bin.tar 解開成
tar -cvzf test.tgz ./aaa 將 ./aaa 目錄下所有檔案使用 gzip 方式壓到 test.tgz 檔中.
tar -xvzf test.tgz 將 test.tgz 檔中所有檔案解壓出來.
touch 建立一個內容空白的新檔案
touch main.py 建立一個內容空白的 main.py 檔案
以上內容節錄自以下網址(僅支援 http,不支援 https):
http://www2.thu.edu.tw/~cc/network_team/unix/command.htm
http://ind.ntou.edu.tw/~jjt/basic_cmd/index3.htm
論壇有另一篇關於 Linux command line 的參考資訊:
Git
git 基礎操作
建立 Git Repository(數據庫)
$ git init
檢查目前 git bash 版本
$ git --version
設定使用者名稱/電子郵件
$ git config --global user.name "sky lin" $ git config --global user.email "sky@sky.lin"
顯示設定列表
$ git config --list
顯示修改檔案清單
加上 -s 參數,僅顯示已修改的檔案名稱。
如果在 -s 後再加上 -b 參數,則會顯示分支的名稱。$ git status
註冊檔案或目錄到索引
$ git add file範例一:註冊單一檔案
$ git add app.js
範例二:註冊多個檔案(使用通用字元 *)
$ git add *.html
範例三:子目錄裡的所有檔案
$ git add .
提交添加到索引的檔案
添加 -a 參數,就可以檢測出有修改的檔案(不包括新增的檔案),將其加入索引並提交。這些操作只要一個指令就可以完成了。
$ git commit -a
加上 -m 參數,就可以指令提交“提交訊息”。如果不添加-m參數,就會啟動修改提交訊息的編輯器。
$ git commit -m "我是註解"
刪除檔案
rm 是 remove 的縮寫
$ git rm file
加上 --cached 參數:讓檔案不再被 Git 版本控制,而不是真的完全刪除
$ git rm --cached index.html # 移除 index.html 不再被 git 控管
參考資料:
git 實作
開始前,先參考整個 git 流程的關係圖。這裡放了三張做比較,資料來源分別列於下方:
來源:本共學課程 Wilson Ren 老師講義簡報
來源:Git 基礎操作 _ W3HexSchool 六角學院
branch, checkout & merge
顯示分支清單
$ git branch
加上 -r 參數,將顯示遠端分支。
加上 -a 參數,可以顯示遠端與本地端的分支。
建立分支
$ git branch branch_name
修改分支名稱
$ git branch -m old_branch_name new_branch_name
刪除分支
$ git branch -d branch_name
如果有未合併到 master 的提交,則無法刪除此分支。如果要強制刪除未提交的分支,請加上 -D 參數執行。
切換分支
$ git checkout branch_name
合併分支
$ git merge branch_name
加上 --no-ff 參數,將建立合併提交,而不是使用 fast-forward 合併。這可以保留分支合併的紀錄,是個非常有用的參數。
老師範例
# 建立一個分支 login,切換到分支、add、commit、切回 master、merge $ git branch login $ git checkout login $ git add . $ git commit -m "Create login.html" $ git checkout master $ git merge login # 然後再建立一個分支 contact,故意讓 index.html 有衝突,來示範解決方式 $ git branch contact $ git checkout contact $ git add . $ git commit -m "Modify index.html" $ git checkout master $ git merge contact # 衝突時,選擇解決方式
本節講師強調重點:
-
checkout: 在 master 和各 branch 間切換
-
merger
a. 一定要先 add → commit → merge
b. merge conflict(範例:master & contact 同時修改)
參考資料:
github
方式一
切換分支
# 上方已 commit 完成 $ git remote add origin https://github.com/yourgithub/project1.git $ git push -u origin master
remote
加入遠端數據庫(Wilson講師的第一種方法,就是上方的範例)
$ git remote add <遠端數據庫簡稱> <url>
觀看遠端數據庫列表
$ git remote
觀看遠端數據庫列表(包含 rule)
$ git remote -v
下載遠端數據庫(Wilson講師推薦的第二種方法)
$ git clone <url>
補充:之前看到一篇介紹如何寫好 github readme 的文章,找到網址後再補上。
Markdown 語法:論壇使用的也是 Markdown 語法
本節參考資料:
https://git-scm.com/book/zh-tw/v2/Git-基礎-與遠端協同工作
方式二(老師推薦)
下載遠端數據庫(Wilson講師推薦的第二種方法)
# 先在 github 中 create a new repository(右上方+號選單中的「New repository」) $ git clone https://github.com/yourgithub/project2.git # 接著是示範寫程式的過程,已大幅簡化,純參考 # 不需要再次 git init $ touch app.js $ touch index.html $ git add . $ git commit -m "Add 2 files for demostration" $ git push https://github.com/yourgithub/project2.git
pull
同事間合作同一專案時,透過 push & pull 讓雙方保持同步。
pull
合併遠端數據庫的分支的修改內容
$ git pull <repository> <refspec>
藉著 pull 命令,可以把遠端數據庫修改的內容合併到本地端數據庫:「pull = fetch + merge」。
可以省略 repository 或 refspec 。省略 repository 名稱時的動作與 push 的時候是相同的。若省略 refspec,會只 pull 現有的分支。
# 使用者 A 修改 index.html $ git add . $ git commit -m "add life need in index.html" $ git push https://github.com/yourgithub/project2.git # 使用者 B pull github 上的資料(local project3) $ git pull https://github.com/yourgithub/project2.git # 使用者 A 新增 form.html $ git add . $ git commit -m "add form.html" $ git push https://github.com/yourgithub/project2.git # 使用者 B pull github 上的資料(local project3) $ git pull https://github.com/yourgithub/project2.git
fetch
查看遠端數據庫分支的修改內容
$ git fetch <repository> <refspec>
要確認遠端數據庫的修改內容,但不想合併內容到本地端數據庫時,可以使用 fetch 命令。fetch 命令不會修改本地端數據庫的分支。
可以省略 repository 或 refspec。省略 repository 時的動作與 push 的時候是相同的。省略 refspec,所有的分支在默認裡會被列為目標。
sourcetree
工具介紹
幾個我主要參考的 git 參考資料: