顯示具有 find與grep 標籤的文章。 顯示所有文章
顯示具有 find與grep 標籤的文章。 顯示所有文章

2023年7月10日 星期一

用find找到空檔案後,印出名稱並刪除

用find找到家目錄下空的檔案:

  •  find ~ -type f -size 0

用find找到家目錄下空的檔案,擁有者叫做NAME,檔名以.az結尾:

  • find ~ -type f -size 0 -user NAME -name "*.az"
  • find ~ -type f -size 0 -user NAME -name "*.az" -exec ls -l {} \;

用find找到家目錄下空的檔案,擁有者叫做NAME,檔名以.az結尾,並計算md5的值。空檔案的md5值會是 d41d8cd98f00b204e9800998ecf8427e

2022年3月21日 星期一

df指令僅顯示本地硬碟與NFS硬碟

指令df會顯示檔案系統的使用量,但現在還會顯示udev, tmpfs, loop device等等,資料太多讓人有點困擾。下面的指令可以去除udev, tmpfs, loop,並且將硬碟或是NVMe硬碟或NFS掛載列出並且上色:

  • df -h | grep -v -e loop -e udev -e tmpfs \
          | grep --color '/dev/sd\|$\|/dev/nvme

第一行的grep用意是在去除loop, udev與tmpfs
第二行的grep則是把硬碟sdx與nvme用顏色標示,並留下其他掛載系統。

2019年9月9日 星期一

找出不包含某使用者的檔案或資料夾

一般使用find會根據檔案的一些特徵來幫忙找檔案。但若想要「反向」找不屬於某使用者的檔案,需要使用到-not這個參數。以下的範例是找尋/etc下面不屬於root的檔案:
  • find /etc -not -user root -type f 2>/dev/null
  • find /etc ! -user root -type f 2>/dev/null
上面兩個指令的意思相同,-not!都只會修飾後面出現的那一個描述。

2019年8月20日 星期二

列出檔案並根據修改日期排序

機器中了綁架病毒(Ransomware),將所有檔案加密後,檔名後綴.adage。這時候想要知道這隻綁架病毒從什麼時候開始將檔案加密,將檔案依照修改時間排序:
  • find . -name "*.adage" -printf "%T@ %Tc %p\n" | sort -n | tail -5
上述指令的參數說明如下:

2019年7月16日 星期二

grep要注意部分匹配的問題

在使用grep用關鍵字抓文本資料的時候,要注意到部分匹配的問題,舉下面的例子:
  1. grep --color -f patterns.txt file.txt
  2. grep --color -xf patterns.txt file.txt
  3. grep --color -wf patterns.txt file.txt
此三個指令說明如下:
  1. 一般抓文本資料的方法,只要列在patterns.txt裡面每一行的式樣(pattern)有匹配到file.txt那一行裡面隨便哪個部分,就會把結果印出來
  2. -x, --line-regexp:必須要file.txt裡面整行都完全與式樣有匹配才印出結果
  3. -w, --word-regexpfile.txt裡面看起來像一個字(word)的與式樣有匹配才會印出結果。一個字的定義是被`[[:<:]]'與`[[:>:]]'包含一群字元

以下範例,首先是式樣(pattern)存成一個叫做patterns.txt的檔案

2019年6月7日 星期五

用find加grep找到內容有某關鍵字的檔案

要找在家目錄下面的檔案,內容含有某個關鍵詞KEYWORD最簡單的方式為:
  • grep -l KEYWORD $(find ~ -type f)
上述的指令若檔名或是資料夾有空格時會出錯,解決方案是:
  • find ~ -type f -print0 | xargs -0 grep -l KEYWORD
  • find ~ -type f -print0 2>/dev/null | xargs -0 grep -l KEYWORD

2018年11月13日 星期二

含有正序全部5個母音的英文單字

英文全部5個母音是 a, e, i, o, u,要找到這些母音依序出現的英文單字:
  • cat /usr/share/dict/words | \
    grep -E "[aA]+[^aeiouAEIOU]*[eE]+[^aeiouAEIOU]*[iI]+[^aeiouAEIOU]*[oO]+[^aeiouAEIOU]*[uU]+" | \
    xargs -n4 -d'\n'
這邊用到兩個操作子:
  • ^:代表否定
  • *:代表存在0個到多個字母

在這個資料庫裡面總共有54個,每4個一行列出來如下:

2018年11月12日 星期一

含有五個母音最短與最長的英文單字

英文字母裡面含有五個母音且最短最長的單字,用下面的指令:
  • cat /usr/share/dict/words | \
    grep -ivE '^([^a]*|[^e]*|[^i]*|[^o]*|[^u]*)$' | \
    awk '{print length " " $0}' | \
    sort -n | head -n 20
  • cat /usr/share/dict/words | \
    grep -ivE '^([^a]*|[^e]*|[^i]*|[^o]*|[^u]*)$' | \
    awk '{print length " " $0}' | \
    sort -n | tail -n 20

2017年10月22日 星期日

find加xargs來處理檔案

用find找到檔案後,再用xargs來處理檔案:
  1. find . -type f | xargs -n1 md5
  2. find . -type f | xargs -n1 -t md5
  3. find . -type f | xargs -n1 -p md5
上面三個指令都一樣,計算所在資料夾下面檔案的MD5雜湊值。差別就是-t可以看到執行前的指令,-p是執行每個指令前都會問要不要做。

2017年10月20日 星期五

用find幫最近下載的檔案計算雜湊值

在Mac的系統下,在網路上同時下載了多個檔案到~/Download底下,用下面的指令就可以計算15分鐘內下載的每個檔案的MD雜湊值:
  • find ~/Downloads -mmin -15 -exec md5 {} \;

2017年8月6日 星期日

PDB中最常出現的氨基酸片段

想要知道五個連續氨基酸出現次數用下面兩個指令就可以得到:
  1. wget ftp://ftp.wwpdb.org/pub/pdb/derived_data/pdb_seqres.txt
  2. cat pdb_seqres.txt | grep -e "mol:protein" -A 1 \
    | sed '/^--$/d' | grep -v "^>" \
    | awk '{while(length($0)>=5){print substr($0,1,5);gsub(/^./,"")}}' \
    | grep X -v | sort | uniq -c | sort -k 1 -n -r \
    > prot_sorted_5peptide.count
第1個指令是下載當前所有PDB檔案序列pdb_seqres.txt,約122MB
第2個指令是計算個數的檔案,結果存在prot_sorted_5peptide.count裡面,計算的時間約莫是五分鐘,下面是分析的指令:

2017年7月7日 星期五

指令列處理文本的工具

在Linux與Mac都提供終端機,並且有一系列的指令用來處理文件:
  1. find, grep
  2. sed, awk
  3. tr, cut, paste
  4. cat, more, less, head, tail, 
  5. fmt, pr
  6. wc, bc
  7. sort, uniq
熟悉上述的指令,運用正規表達式(regular expression)並搭配資料重新導向(I/O redirection),其實許多資料處理根本不需要寫程式,直接用指令就可以處理完成

2016年11月17日 星期四

用tar打包很多個檔案的技巧

用tar打包某些檔案通常只要輸入
  • tar cf x.tar *
但若是檔案很多的時候,會出現arguments too long之類的錯誤訊息。最簡單的解法是打包這些檔案所在的資料夾。不過也可以用下面這個方式來處理:
  1. find . -name "*" > ../folder.list
  2. tar -I ../folder.list -cf > ../folder.tar
  3. tar -I ../folder.list -cf - | pigz -p 4 > ../folder.tgz

2016年10月28日 星期五

Shell一行文:刪除最近產生的檔案

不小心產生一堆檔案,懶得一個一個殺掉,可以用find搭配rm來達成:
  • find /tmp/ -type f -user USERNAME -atime -5m -exec rm {} \; 
參數的意思分別是:
  • /tmp/ :存放檔案放置的資料夾
  • -type f:想要刪除的只有檔案
  • -user USERNAME:檔案擁有者叫做USERNAME
  • -atime -5m:五分鐘內產生的檔案
  • -exec rm {}:五分刪除前面產生的檔案
  • \;:find後面有執行指令都要加入這個

參考資料

_EOF_

2016年7月4日 星期一

用find找最近使用過的檔案

想要找到家目錄下面,最近6天內使用過的shell script檔案(結尾是.sh):
  1. cd ~
  2. find . -name "*.sh" -atime -6
  3. find . -name "*.sh" -atime -6 -printf "%T+\t%p\n" | sort
上述指令的意義如下

2016年6月20日 星期一

用find找檔案

在類UNIX系統(像Linux, Mac, BSD...)下面找檔案的指令叫做find。使用find,可以根據下面幾個檔案的特徵來搜尋:
  • 名稱:不一定要全名,可以是某個pattern
  • 型態:例如「檔案」、「目錄」、「連結」等等
  • 大小:大於或小於多少MB的檔案
  • 時間:檔案建立的時間、修改的時間
  • 擁有者:檔案由哪些人擁有