Contents

快速查詢多個檔案方法

快速查詢多個檔案方法

有時候工作上會突然拿到一大串編號、檔名或訂單號,接著被要求去一堆資料夾裡面把對應檔案找出來。這種時候如果還一個一個手動找,效率會很差。早期我也只是把一長串 find -regex 記起來,但後來發現還是需要把思路整理清楚,之後才不會每次都重查一次。

這篇把幾個常用方向分開來看:找檔名、找檔案內容、找壓縮檔裡面的內容。

先分清楚你要找的是什麼

通常需求會分成 3 種:

  1. 我知道部分檔名,要找出哪些檔案存在。
  2. 我知道關鍵字,要找哪些檔案內容有出現。
  3. 我連壓縮檔也要一起查。

不同情境適合的指令不太一樣,不一定都該用 find。

1. 找檔名:find

如果你手上有很多編號,想知道哪些檔案名稱有對到,find 搭配 regex 很實用。

1
find */ -regex '.*UZ29564846.*\|.*UZ02104919.*\|.*UZ02605231.*\|.*UZ02771129.*\|.*UZ03128013.*\|.*UZ03645989.*\|.*UZ04195564.*\|.*UZ04258665.*\|.*UZ04572090.*\|.*UZ04582332.*\|.*UZ04795657.*\|.*UZ04795658.*\|.*UZ04805060.*\|.*UZ04906998.*\|.*UZ05422771.*\|.*UZ05959297.*\|.*UZ06513505.*\|.*UZ06513808.*\|.*UZ06557497.*\|.*UZ06627631.*\|.*UZ06844457.*\|.*UZ06858381.*\|.*UZ07690050.*\|.*UZ07745374.*\|.*UZ07973794.*\|.*UZ08481252.*\|.*UZ08483243.*\|.*UZ08994865.*\|.*UZ09219703.*\|.*UZ09617909.*\|.*UZ09744363.*\|.*UZ10085340.*\|.*UZ10147439.*\|.*UZ10265614.*\|.*UZ10349030.*\|.*UZ11080689.*\|.*UZ11113319.*\|.*UZ11239587.*\|.*UZ11340496.*\|.*UZ11358240.*\|.*UZ11369419.*\|.*UZ11574001.*\|.*UZ13383394.*\|.*UZ12044029.*\|.*UZ12052655.*\|.*UZ12305719.*\|.*UZ13379585.*\|.*UZ12380320.*\|.*UZ12512884.*\|.*UZ13031886.*\|.*UZ13178378.*\|.*UZ13221862.*\|.*UZ12812003.*\|.*UZ12897804.*\|.*UZ13218549.*\|.*UZ13219157.*\|.*UZ13740815.*\|.*UZ13740852.*\|.*UZ13813311.*\|.*UZ13971437.*\|.*UZ13991424.*\|.*UZ14256642.*\|.*UZ14325289.*\|.*UZ14450802.*\|.*UZ14490320.*\|.*UZ14610042.*\|.*UZ14629788.*\|.*UZ14676668.*\|.*UZ14725354.*\|.*UZ14781828.*\|.*UZ14847205.*\|.*UZ15257774.*\|.*UZ15368931.*\|.*UZ15508841.*\|.*UZ15715055.*\|.*UZ16018567.*\|.*UZ16265337.*\|.*UZ16390441.*\|.*UZ16515932.*\|.*UZ16624108.*\|.*UZ16746539.*\|.*UZ17064104.*\|.*UZ17324547.*\|.*UZ17336391.*\|.*UZ20836990.*\|.*UZ22806918.*\|.*UZ23183708.*\|.*UZ24312875.*\|.*UZ24380058.*\|.*UZ24602016.*'

上面這種寫法適合一次找很多代碼,但可讀性很差。實務上如果條件很多,我通常會把代碼清單另外整理成檔案,再用腳本組 regex,會比手打安全很多。

如果只是簡單關鍵字,其實用 -name 或 -iname 會更直覺:

1
find . -iname '*invoice*'

2. 找內容:grep 或 rg

如果你是要找檔案內容,而不是檔名,grep 或 rg 會更適合。

例如:

1
grep -R "ERROR-001" .

或用比較快的 rg:

1
rg "ERROR-001"

rg 在大量檔案下通常比傳統 grep -R 快很多,也比較適合平常開發時用。

globstar 大法

有些 Shell 可以開 globstar,讓 ** 做遞迴匹配,例如:

1
2
shopt -s globstar
grep "ERROR-001" **/*.log

這種寫法在快速查詢時也不錯,但前提是 Shell 有支援,而且同事也看得懂,不然可維護性不一定比 find 高。

直接找 zip 檔案內容

如果是 .gz 這種壓縮檔內容,建議直接用 zgrep:

1
zgrep "ERROR-001" *.gz

如果是 tar.gz,可以先列內容,不一定要先解壓:

1
tar -tzf archive.tar.gz

我自己的選擇順序

現在如果遇到查很多檔案,我大概會這樣選:

  1. 找檔名:find
  2. 找內容:rg
  3. 查 .gz:zgrep
  4. 查 tar.gz 內清單:tar -tzf

這樣分開思考,比把所有需求都硬塞進一條超長指令清楚很多。

小結

快速查詢多個檔案這件事,關鍵不是背一條很長的指令,而是先判斷你到底在找檔名還是找內容。能把這個問題拆開,後面選 find、grep、rg、zgrep 才會比較準,也比較不容易在壓力下打錯。

https://ideone.com/7nbElh