Command Tips

正則工具

http://rubular.com/

vim 批次編碼轉換

vim +"argdo se nobomb| set nomore | se fenc=utf8 | w" $(find . -type f -iname '*.java')

去除 Delete Newlines (CRLF) with sed or use dos2unix

find . -iname '*.cpp' -exec sed -i 's/\r//g'  {} \;

find . -type f  -iname "*.c" | xargs dos2unix

如何用 shell 從變數中截取出檔名和副檔名呢?

取副檔名:extension="${filename##*.}"

取檔名:filename="${filename%.*}"

一行指令迴圈

while true; do    echo "hello";    sleep 2; done

pdftotext

find . -iname '*.pdf' -print -exec pdftotext '{}' - \; | grep --color -i "unix"

把檔名裡面的所有空白換成底線

rename 's/\ /_/g' *

檔案大寫轉小寫

find -type f -exec rename 's/[A-Z]/\L$&/g' {} \;

Linux 批次修改副檔名

把副檔名抓成 IMG0000.jpg.jpg ,但我預期的副檔名應該是 IMG0000.jpg

rename -v 's/\.jpg.jpg$/\.jpg/' *.jpg

sed 替換字串使用正則

.. image:: /_static/seq_Mediator.jpg替換成![](../_static/seq_Mediator.jpg)

echo ".. image:: /_static/SimpleFactory.jpg"|sed -r 's/^.*:: (.*)/![](\1)/'

![](/_static/SimpleFactory.jpg)

(.*) // pattern /_static/SimpleFactory.jpg

\1 // 代表是第一組 pattern 即是 /_static/SimpleFactory.jpg

echo ".. image:: /_static/SimpleFactory.jpg"|sed -r 's/^.*:: (.*)/![]\1/'

![]/_static/SimpleFactory.jpg
find . -name '*.rst' -exec sed -ri.bak 's/^.*:: (.*)/![](\.\.\1)/' {} \;

用 uniq 和 sort 指令清除重複行和空白行

sort chtuniq.txt | uniq > result.txt

上面這行指令只能留下不重覆的行,所以,還是會有一個空白行的哩 !

sort chtuniq.txt | uniq | sed /^$/d > result.txt

為什麼在用 uniq 指令前要先用 sort 指令來排序一下呢 ? 這是因為 uniq 指令只跟上一行比對是否有重複而已,所以,如果重複的資料不排在一起,那麼 uniq 指令就等於是無效哩 ! 所以,在使用 uniq 指令前,要先搖一搖,喔 ! 不! 是要先用 sort 指令排一排哩 !

nohup &

nohup make 2>&1 > make.log &

在 Linux 上找出空目錄, 而且刪掉它

find /tmp -depth -empty -type d
find /tmp -depth -empty -type d -exec rmdir -v {} \;

查詢檔案大小幾G

du -h -d 1 | grep [0-9]G

basename & dirname

basename /usr/local/etc
etc

這個指令會將後面的[目錄]僅擷取出最後面的那個目錄或檔案

dirname /usr/local/etc
/usr/local

恰恰與 basename 相反,他僅是秀出來前面的『目錄』部分喔!

取副檔名 & 取檔名

取副檔名:extension="${filename##*.}"
取檔名:filename="${filename%.*}"

## 是從變數內容的前面,移除與 ## 後面定義的 pattern (也就是 *.) 相符合的部分(越長越好),

因此檔名的部分加上 . 就會被移除,留下最後面的副檔名~

% 是從變數內容的後面,移除與 % 後面定義的 pattern (也就是 .*) 相符合的部分(越短越好),

因此 .副檔名 就會被移除掉,留下前面的檔名部分~

Crontab 定時

0 3,6 * * * /usr/bin/nohup /usr/bin/python /home/xxx/xx.py 2>&1 | tee /tmp/xx.log &
  • 編輯crontab檔案
crontab -e
  • 刪除crontab檔案
crontab -r
  • restart
/etc/init.d/cron restart

Linux : BIG-5 與 UTF-8 檔案轉換

  • Big-5 To Utf-8
iconv -f big5 -t utf-8 big5.txt -o utf8.txt
  • Utf-8 To Big-5
iconv -f utf-8 -t big5 utf8.txt -o big5.txt

檔案第一行加入字串

sed -i '1i\<meta http-equiv="content-type" content="text/html; charset=UTF-8">'  *.md

search for a Word in jar files

find . -name "*.jar" -exec zipgrep "toAxisAngle" '{}' \;

用find和cp組合實現將find出來的文件批量拷貝到目標文件夾

find . -name *.jar | xargs -i cp {} ~/jar_files/

sed 刪除關鍵字串那行

find . -name '*.java' -exec sed -i '/System\.out\.println/d' {} \;

查看各目錄大小

du -h --max-depth=1

搜尋隱藏檔案內容

find . -maxdepth 2 -type f -iname ".*" | xargs ag 'vim'

书籍推荐