您好,登錄后才能下訂單哦!
Linux下的查找命令是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
查找是我們每天都在做的事情,早上醒來找下手機,出門之前查下公交,坐下之后查下資料,分析數據查下模式。
查找文件,查找信息,查找錯誤是應用起來更為具體的一些工作,而Linux命令行為我們提供了很多快捷強大的查找方式。
whereis program_name
: 會在系統默認安裝目錄(一般是有root權限時默認安裝的軟件)查找二進制文件、源碼、文檔中包含給定查詢關鍵詞的文件。(默認目錄有 /bin
, /sbin
, /usr/bin
, /usr/lib
, /usr/local/man
等類似路徑)
which program_name
: 會給出所有在環境變量中的程序的路徑,一來方便知道運行的程序在哪,二來方便修改。(PATH和path,傻傻分不清)
比如vim which sp_pheatmap.sh
就可以直接修改繪制熱圖的腳本,cp
which sp_pheatmap.sh.
可以直接把源碼拷貝到當前目錄,省去了寫全路徑的麻煩。
如果運行which bwa
,系統返回是 /usr/bin/which: no bwa in (/home/usr/bin:/bin)
則說明bwa沒有放置在環境變量中,不可以直接寫名字調用。
locate
是快速查找定位文件的好方法,但其依賴于updatedb
建立的索引。而updatedb
一般是每天運行一次,所以當天的新文件是索引不到的。
如果有根用戶權限,可以手動運行updatedb
做個更新,然后再locate bwa
。
(個人用戶也可以構建自己的updatedb, 使用locate在局部環境中查找。)
find / -name bwa
可以搜索根目錄下所有名字為bwa的文件
運行上面的命令時會輸出很多Permission denied
,是因為 作為普通用戶,無權限訪問一些目錄,因此會有提示輸出,可以使用find / -name bwa 2>/dev/null
重定向標準錯誤到空設備,報錯信息就被扔掉了,還不影響正常輸出。
按時間查找
我們開發的在線畫圖網站 (www.ehbio.com/ImageGP),為了追蹤每天用戶使用時碰到了什么問題,需要每天定時去查看日志。
這個命令find . -name *.log -mmine -60
可以查看當前目錄下(包括所有子目錄)一小時內修改的日志文件。再配合head
就可以查看每個日志文件的內容,以方便查看使用過程中出現了哪些錯誤,如何增加提示或修改畫圖程序。
正是有了這個利器,前臺的錯誤提示中才出現了這么一句話,如果您核對后數據和參數沒問題,請過1天再進行嘗試。若是程序問題,我們通常會在1天內修復。
當然后臺數據都是用時間戳存儲的,而且若無報錯,數據會直接刪掉,有報錯的才會保留日志,不會泄露用戶信息,這點大家不用擔心。
現在畫圖網站越來越穩定,出現的問題越來越少,前臺提示也越來越完善,希望大家使用時多看下提示,查看日志的頻率也少了,就使用find . -name *.log -mtime -1
查看從現在起24小時內的日志了。
這個也有個問題,每次查看的時間可能不一致,會漏查或有重疊,于是在某次查看完日志后,使用touch check
在當前目錄下新建了個空文件。以后再查日志文件時,只要使用find . -name *.log -newer check
就可以獲得所有上次查看過之后的新日志。每次查看完之后,都做個書簽,就方便多了。
慢慢發現有空日志文件, 使用find . -name *.log -newer check -size +0
過濾掉, 只保留大小大于0的文件。就這樣在小伙伴聰明勤奮地維持下,我們繪圖網站2年間為大家提供了近30萬次服務。(畫圖手冊 | ImageGP:今天你“plot”了嗎?)
按類型和大小查找
如果我想得到當前目錄下所有png
和jpg
照片呢?
使用 find . \( -name "*.png" -o -name "*.jpg" \) | less
或 find . -regex ".*\(\.png\|\.jpg\)$"
find . -type f -size +100G
可以獲取大小超過100G的文件。
限制查找深度
只看當前目錄2層子目錄內的文件find . -maxdepth 2 -name *.log
。
查看不是log
結尾的文件find . -not -name *.log
。還有更多組合操作,詳見find文檔 (我在群里扔了一個關于查找的問題,結果……)。
find可以查找包含某句話的文件嗎?還是拿我們的日志說事吧,find . -name *.log -exec grep -l 'Error' {} \;
就可以返回所有包含Error
單詞的文件名。
find . -name *.log | xargs grep -l 'Error'
也可以。
grep -rl 'Error' *
也可以,不加-l
還可以順便返回匹配的行。
匹配行的前后行
grep -A 5 -B 1 'Bioinfo' ehbio.log
可以查看匹配行的前1行(B, before)和后5行(A, after)。
匹配次數
grep -c 'Bioinfo' ehbio.log
可以統計包含Bioinfo的行數
grep -ci 'Bioinfo' ehbio.log
則會在匹配時忽略大小寫。
統計FASTA序列中的序列數 grep '^>' ehbio.fa
統計FASTQ序列中的序列數 grep '^+$' ehbio.fq
。(^表示以什么開頭,$表示以什么結尾)。
獲取未匹配行
grep -v 'Bioinfo' ehbio.log
,讀讀手冊(man grep
),可以看到更多參數使用。
序列提取
假設有個基因列表文件 (ID),有個單行序列的FASTA文件 (ehbio.fa), 運行如下命令grep -A 1 -Fw -f id ehbio.fa | grep -v -- '--'
就可以批量提取序列了。
-f id
表示把id文件中的每一行作為一個匹配模式。-F
表示匹配模式作為原始字符串,而非正則表達式,這是以防有特殊字符被解析。-w
則表示作為一個單詞匹配,即假如id中有Sox2
,那么它會匹配Sox2
,也會匹配Sox21
;如果加了-w
,則不會匹配Sox21
。
更好的序列批量提取見 awk的使用。
模式匹配
grep強大的功能是支持正則匹配,默認使用基本正則表達式,-E
使用擴展的正則表達式,-P
使用perl格式的正則表達式。
比如想去掉文件中所有的空行grep -v '^$' ehbio.fa >ehbio.clean.fa
;
從公眾號文章中搜索跟文章寫作相關的文章 grep 'writ.*' *.md
(可以匹配write, writing等字);
Linux是一種免費使用和自由傳播的類UNIX操作系統,是一個基于POSIX的多用戶、多任務、支持多線程和多CPU的操作系統,使用Linux能運行主要的Unix工具軟件、應用程序和網絡協議。
看完上述內容,你們掌握Linux下的查找命令是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。