有一陣子記的筆記,來放到網路上好了
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
- awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
一個awk腳本通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊3部分組成,這三個部分是可選的。任意一個部分都可以不出現在腳本中,腳本通常是被單引號或雙引號中- BEGIN語句塊 在awk開始從輸入流中 讀取行之前 被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中。
- END語句塊 在awk從輸入流中 讀取完所有的行之後 即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊。
- 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
備註:
sed 和 awk 這兩大工具時常被拿來相提並論,因二者一樣強大和對正規表示法有良好的支援。也各自有自己專屬的腳本語言(script language),sed 主要功能為自動化的修改文字檔,而 awk 可想像為超輕量級的 C 直譯語言(Interpreted language)屬通用,偏向統計和需輸出重新排版的應用。
其他詳細說明可參 http://man.linuxde.net/awk
18. grep
- grep 的全寫是 “global regular expression print”,是 Linux 系統內置的字串搜索工具, 它可以用作搜索檔案的內容
- grep string filename - 基本用法
- 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
參考資料
請問For f in 如何改變包含子目錄內的檔案?
因為nas機器上有大量副檔名需要改,所以上網找到了
'''
for f in *.nampohyu; do mv -- "$f" "${f%.nampohyu}"; done
'''
但是只改了當前目錄下的檔案,並沒有包含子目錄下。
請問我該如何用這個 shellscript 達到包含子目錄下檔案也一起改副檔名?
請專家指導謝謝!