iT邦幫忙

5

Shell Command 筆記

有一陣子記的筆記,來放到網路上好了

1. cd - 進入資料夾

2. ls - 查看該資料夾中的檔案

3. tree - 使用樹狀圖模式,查看資料夾和檔案的依從關係

    1. tree -a - 顯示所有文件和目錄
    2. tree -A - 使用ASNI顯示樹狀圖
    3. tree -f - 在每個目錄或文件之前,顯示完整的路徑
    4. tree -i - 不以階梯狀列出檔案或目錄的名稱
    5. tree -p - 列出權限標示
    6. tree -t - 以更改的時間排序
    7. tree -x (資料夾) - 只顯示該資料夾下的資料夾和檔案
    8. pwd - 查看目前路徑

4. touch - 建立新檔案

5. mv (source) (target) - 搬移檔案或目錄,如若source與target路徑相同,但檔名不同,則可以做到檔案改名

    1. mv -b (source) (target) - 搬移檔案或目錄,如果需要覆蓋舊有文件,會先對舊有文件做備份
    2. mv -f (source) (target) - 搬移檔案或目錄,強制,如果目標文件已存在,不會詢問是否要覆蓋舊有目標文件,便直接覆蓋
    3. mv -i (source) (target) - 搬移檔案或目錄,如果目標文件已存在,會先詢問是否要覆蓋舊有目標文件
    4. mv -u (source) (target) - 搬移檔案或目錄,如果目標文件已存在,但source的比較新以,才會把舊有的目標文件覆蓋

6. cp (source) (target) - copy檔案或目錄

    1. cp指令 配合 -b, -f, -i, -u 的用法,和使用 mv指令 時是一樣的

7. rm - 刪除資料夾或檔案

    1. -r - 指指定目錄下的檔案和資料夾都一併刪除

8. cp - 拷貝資料夾或檔案

    1. cp指令 配合 -f, -i 的用法,和使用 mv指令 時是一樣的

9. mkdir - 建立資料夾

    1. mkdir -p 或 --parents - 建立目錄時,若其上層的目錄夾未建立,會一併建立

10. find (搜尋路徑,必要項目) (要找的檔案或資料夾) - 找符合條件的檔案或資料夾

    1. -o - 「或」的修件
    2. -exec (指令) - find指令回傳為true時,就執行接下來的指令
    3. -name - 查尋,區分大小寫
    4. -iname - 查尋,不區分大小寫
    5. -expty - 尋找0byte的檔案,或是空資料夾
    6. -type d - 只想尋找資料夾
    7. -type f - 只想尋找檔案
    8. -depth - 從指定目錄下,多深的子資料夾開始找
    9. -mindepth - 從指定目錄下,最淺的子資料夾開始找
    10. -maxdepth - 從指定目錄下,最深的子資料夾開始找
    11. -size +50M - 大於50mb
    12. -size -50M - 小於50mb
    13. -atime +7 - 超過7日沒有被存取或修改過
    14. -atime -7 - 7日內沒有被存取或修改過
    15. -ctime +10 - 超過10天沒有被存取或修改過
    16. -amin +10 - 超過10分鐘沒有被存取或修改過
    17. -user john - 找尋帳號名稱為john的人所屬的檔案
    範例:只找名為a的這個資料夾下,檔案小於10kb的txt檔
    find ./a '*.txt' -type f -size -10k

11. cat - 顯示文字的內容

    1. -n 或 -number - 顯示行號
    2. -b 或 -number-nonblank - 顯示行號,但是空白行不編號
    3. -s 或 --squeeze-blank - 2行以上的空白行,會被替換成1行的空白行

12. head - 顯示文件的內容,預設為開頭的10行(含空白行)

    1. -n 3 - 顯示文件內容的頭3行
    2. -c 300 - 顯示文件內容的頭300個'字符數'

13. tail - 顯示文件的內容,預設為最尾的10行(含空白行)

    1. -n 3 - 顯示文件內容的最尾3行
    2. -c 300 - 顯示文件內容的最後300個'字符數'
    3. +20 - 從文件的第20行開始顯示,直到結尾

14. sort - 排序

    1. -f - 忽略大小寫
    2. -b - 忽略最前的空白字元
    3. -M - 以月分排序
    4. -n - 以數字排序
    5. -r - 反轉排序
    6. -uniq - 相同的資料只出現一次
    7. -t - 資料用tab分隔
    8. -k - 同區間進行排序
    範例
    df | sort -n -r -k 5 - 

15. uniq - 忽略檔案中的重覆行,一般與sort合用

    1. -c 或 -count - 在每列的開頭顯示重覆的次數
    2. -d 或 --repeated - 只顯示重覆出現的行列
    3. -f=欄位 或 --skip-fields=欄位 - 忽略比較指定的欄位
    4. -s 或 --skip-chars=字符位置 - 忽略比較指定字符
    5. -u 或 --unique - 只出現一次的行列
    6. -w 或 --check-chars=字符位置 - 指定要比較的字符
    刪除重覆行
    uniq file.txt 
    sort file.txt | uniq 
    sort -u file.txt
    只顯示單一行
    uniq -u file.txt
    sort file.txt | uniq -u
    統計各行在文件中出現的字數
    sort file.txt | uniq -c
    在文件中找出重覆的行
    sort file.txt | uniq -d

16. wc - 計算檔案的列數(-l)、單字數(-w)、及位元數(-c),,由左至右顯示

    1. -c 或 --bytes - 顯示位元數統計
    2. -m 或 --chars - 顯示字母數統計
    3. -l 或 --lines - 顯示列數統計
    4. -L 或 --max-line-length - 印出最長一行的字數
    5. -w 或 --words - 顯示單字數(word)統計

17. awk

  1. awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
    一個awk腳本通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊3部分組成,這三個部分是可選的。任意一個部分都可以不出現在腳本中,腳本通常是被單引號或雙引號中
  2. BEGIN語句塊 在awk開始從輸入流中 讀取行之前 被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中。
  3. END語句塊 在awk從輸入流中 讀取完所有的行之後 即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊。
  4. pattern語句塊 中的通用命令是最重要的部分,它也是可選的。如果沒有提供pattern語句塊,則 默認執行{ print } ,即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊。
    1. $n - 當前記錄的第n個字段,比如n為1表示第一個字段,n為2表示第二個字段。
    2. $0 - 這個變量包含執行過程中當前行的文本內容。
    3. ARGC - 命令行參數的數目。
    4. ARGIND - 命令行中當前文件的位置(從0開始算)。
    5. ARGV - 包含命令行參數的數組。
    6. CONVFMT - 數字轉換格式(默認值為%.6g)。
    7. ENVIRON - 環境變量關聯數組。
    8. ERRNO - 最後一個系統錯誤的描述。
    9. FIELDWIDTHS - 字段寬度列表(用空格鍵分隔)。
    10. FILENAME - 當前輸入文件的名。
    11. FNR - 同NR,但相對於當前文件。
    12. FS - 字段分隔符(默認是任何空格)。
    13. IGNORECASE - 如果為真,則進行忽略大小寫的匹配。
    14. NF - 表示字段數,在執行過程中對應於當前的字段數。
    15. NR - 表示記錄數,在執行過程中對應於當前的行號。
    16. OFMT - 數字的輸出格式(默認值是%.6g)。
    17. OFS - 輸出字段分隔符(默認值是一個空格)。
    18. ORS - 輸出記錄分隔符(默認值是一個換行符)。
    19. RS - 記錄分隔符(默認是一個換行符)。
    20. RSTART - 由match函數所匹配的字符串的第一個位置。
    21. RLENGTH - 由match函數所匹配的字符串的長度。
    22. SUBSEP - 數組下標分隔符(默認值是34)。
    運算符	描述
    + -	加,減
    * / &	乘,除與求余
    + - !	加,減和邏輯非
    ^ ***	求冪
    ++ --	增加或減少,作為前綴或後綴
    範例:輸出每一行的第二和第三個字段
    awk '{ print $2,$3 }' filename
    範例:統計文件中的行數
    awk 'END{ print NR }' filename
    範例:只print偶數行
    awk 'NR%2==1{next}{print NR,$0;}' filename

備註:
sedawk 這兩大工具時常被拿來相提並論,因二者一樣強大和對正規表示法有良好的支援。也各自有自己專屬的腳本語言(script language),sed 主要功能為自動化的修改文字檔,而 awk 可想像為超輕量級的 C 直譯語言(Interpreted language)屬通用,偏向統計和需輸出重新排版的應用。
其他詳細說明可參 http://man.linuxde.net/awk

18. grep

  1. grep 的全寫是 “global regular expression print”,是 Linux 系統內置的字串搜索工具, 它可以用作搜索檔案的內容
  2. grep string filename - 基本用法
  3. grep string filename1 filename2 - 同時在2個file中做search
    1. -I - 忽略大小寫 
    2. -c - 字串在檔案中的共有幾行符合 
    3. -l - 從多個文件中查找包含匹配項 
    4. -v - 查找不包含匹配項的行 
    5. -n - 字串在檔案中的第幾行,以及該行的內容
    6. -q - 不會輸出任何信息,如果命令運行成功返回0,失敗則返回非0值。一般用於條件測試
    7. \ - 忽略正則表達式中特殊字符的原有含義 
    8. ^ - 匹配正則表達式的開始行 
    9. $ - 匹配正則表達式的結束行 
    10. \< - 從匹配正則表達式的行開始 
    11. \>; - 到匹配正則表達式的行結束 
    12. [ ] - 單個字符;如[A] 即A符合要求 
    13. [ - ] - 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求 
    14. . - 所有的單個字符 
    15. * - 所有字符,長度可以為0
    範例:資料夾中有很多的資料夾及檔案,只想從中找出html副檔名的檔案
    ls -l path | grep .html 
    範例:搜尋出空白行
    grep $ filenmae
    範例:在檔案中尋找出大寫的A、B、C、D
    more filename | grep '[A-D]'

19. sed

grep雖可利用功能強大的正規表示法搜尋檔案中的字串,
但沒辦法對搜尋到的字串進行刪除,取代或插入等編輯動作;

    sed的基本用法如下
    sed [-OPTION] [ADD1][,ADD2] [COMMAND] [/PATTERN][/REPLACEMENT]/[FLAG] [FILE]
    OPTION
    1. -e - 執行 sed 的 script 語法,如沒使用 -f 選項此為預設選項
    2. -f - 選用外部的 script 檔來執行 
    3. -n - 不輸出 pattern space 到螢幕 
    4. -l 數字 - 時常和 COMMAND l(小寫的〝L〞)一起使用時,指定每一行的長度
    5. -r - 使用延伸正規表示
    6. --help - 指令自帶說明
    COMMAND
    1. a - 在當前行下面插入文本
    2. i - 在當前行上面插入文本
    3. c - 把選定的行改為新的文本
    4. d - 刪除,刪除選擇的行
    5. D - 刪除模板塊的第一行
    6. s - 替換指定字符 h 拷貝模板塊的內容到內存中的緩沖區
    7. H - 追加模板塊的內容到內存中的緩沖區
    8. g - 獲得內存緩沖區的內容,並替代當前模板塊中的文本
    9. G - 獲得內存緩沖區的內容,並追加到當前模板塊文本的後面
    10. l - 列表不能打印字符的清單
    11. n - 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令
    12. N - 追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼
    13. p - 打印模板塊的行
    14. P - (大寫) 打印模板塊的第一行
    15. q - 退出Sed
    16. b lable - 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾
    17. r file - 從file中讀行
    18. t label - if分支,從最後一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾
    19. T label - 錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾
    20. w file - 寫並追加模板塊到file末尾
    21. W file - 寫並追加模板塊的第一行到file末尾
    22. ! - 表示後面的命令對所有沒有被選定的行發生作用
    23. = - 打印當前行號碼
    24. # - 把註釋擴展到下一個換行符以前
    REPLACEMENT
    1. g - 表示行內全面替換。
    2. p - 表示print行。
    3. w - 表示把行寫入一個文件。
    4. x - 表示互換模板塊中的文本和緩沖區中的文本。
    5. y - 表示把一個字符翻譯為另外的字符(但是不用於正則表達式)
    6. \1 - 子串匹配標記
    7. & - 已匹配字符串標記

20. tr

可以對來自標準輸入的字符進行替換、壓縮和刪除
可以將一組字符變成另一組字符

    基本語法
    tr(選項)(find string)(replaced string)
    選項
    1. -c 或 ——complerment - 取代所有不屬於第一字符集的字符
    2. -d 或 ——delete - 刪除所有屬於第一字符集的字符
    3. -s 或 --squeeze-repeats - 把連續重複的字符以單獨一個字符表示
    4. -t 或 --truncate-set1 - 先刪除第一字符集較第二字符集多出的字符
    PS:執行刪除動作時,並不需要(replaced string)
    字符
    1. [:alnum:] - 字母和數字 
    2. [:alpha:] - 字母 
    3. [:cntrl:] - 控制(非打印)字符 
    4. [:digit:] - 數字 
    5. [:graph:] - 圖形字符 
    6. [:lower:] - 小寫字母 
    7. [:print:] - 可印出字符 
    8. [:punct:] - 標點符號 
    9. [:space:] - 空白字符 
    10. [:upper:] - 大寫字母 
    11. [:xdigit:] - 十六進制字符
    範例:刪除字串
    指令 - echo "hello 123 world 456" | tr -d '0-9' 
    結果 - hello world
    範例:字串由大寫轉為小寫
    指令 - echo "HELLO WORLD" | tr 'A-Z' 'a-z' 或 echo "hello WORLD" | tr '[:upper:]' '[:lower:]' 
    結果 - hello world

21. xargs - 將參數列轉換成小塊分段傳遞給其他命令,以避免參數列過長的問題

    1. -0 - 從\0開始分
    2. -t - 從製表符開始分
    3. -r - 從ENTER開始分
    範例:讀取檔案內容後,強制以單行輸出
    cat filename | xargs 
    範例:讀取檔案內容後,每三節文字(也就是正則的\s+)便強制換行
    cat filename | xargs -n3 

參考資料

  1. http://man.linuxde.net/cp
  2. http://yjplxq.blog.51cto.com/4081353/958888
  3. http://www.cnblogs.com/ayseeing/p/4097066.html
  4. http://blog.miniasp.com/post/2010/08/27/Linux-find-command-tips-and-notice.aspx
  5. http://man.linuxde.net/find
  6. http://man.linuxde.net/awk
  7. http://wanggen.myweb.hinet.net/ach3/ach3.html?MywebPageId=2017311490952599803#awk
  8. http://ithelp.ithome.com.tw/articles/10136126
  9. http://huenlil.pixnet.net/blog/post/26326320-%5B%E8%BD%89%5Dgrep%E5%91%BD%E4%BB%A4%E4%BB%8B%E7%B4%B9
  10. http://man.linuxde.net/grep
  11. http://yjplxq.blog.51cto.com/4081353/1034687
  12. http://hoppersu.myweb.hinet.net/aix/html/aix_introd_c06.htm
  13. http://www.jianshu.com/p/f51b178237c8
  14. http://wanggen.myweb.hinet.net/ach3/ach3.html
  15. http://man.linuxde.net/sed
  16. https://zh.wikipedia.org/wiki/Xargs
  17. https://blog.longwin.com.tw/2014/06/parallel-ssh-command-exec-2014/
  18. http://blog.zeroplex.tw/2015/08/gnu-parallel.html
  19. http://www.jianshu.com/p/c5a2369fa613
  20. https://www.zhihu.com/question/29257300

2 則留言

0
cpc0935
iT邦新手 2 級 ‧ 2017-06-27 17:47:23

謝謝

0
eqpeter
iT邦新手 5 級 ‧ 2019-05-17 12:53:04

請問For f in 如何改變包含子目錄內的檔案?
因為nas機器上有大量副檔名需要改,所以上網找到了
'''
for f in *.nampohyu; do mv -- "$f" "${f%.nampohyu}"; done
'''
但是只改了當前目錄下的檔案,並沒有包含子目錄下。
請問我該如何用這個 shellscript 達到包含子目錄下檔案也一起改副檔名?

請專家指導謝謝!

我要留言

立即登入留言