如何找到有特定內容的檔案名稱?
結論:
> find ./ -type f | xargs -i grep -l 'target' {}
> find ./ -type f | xargs -i grep -l 'target' {}
廢話:
大海撈針, 乾草堆裡找線頭. 絕對不要捲起袖子自己做.
現在還有人沒使用過 Google 的搜尋服務? 曾幾何時 不用說就是1998, Google誕生之前. 可憐的蓋世(GAIS)搜索, 還有人記得?, 各家網頁黃頁服務爭鳴, Yahoo 也因此崛起. 但如今還有幾人知曉蕃薯藤, 更不用說是其他小型入口網站. 而原本占據在瀏覽器 書籤 或 我的最愛 的各種網頁索引或目錄網站也早已消失不見. 取而代之的是 搜尋.
正文:
茫茫資訊海, 誰來搜尋? 一曰 find
, 再者 grep
.
find
功力強大, 能幫助你找到檔案, 但並不能幫助你找到檔案內有甚麼? 簡單的介紹用法, 如下.
根據檔名來找,
> find . -name "*.log" -print
//find -name -print
//find 後面接要搜尋的路徑, -name 後面接要比對的模式, 用 -print 將找到的檔案印出
接在 find
命令後的表達式, 主要可以區分 測試(Tests), 行動(Actions), 關聯操作(Operators) 等部分.
- 測試(Tests)會根據參數或描述傳回
true
或 false
.
- 行動(Actions)指示找到檔案後要做的事
, 例如:
-print`指示將找到的路徑列印出來.
- 關聯操作(Operators)則是用來連接不同的參數或描述.
-o
意指 OR, -a
意指 AND. 沒指定就是-a
.
根據名稱來找,
> find . -name "*.log" -print
上述範例是要"印出所有當前目錄下, 名字以 .log 結尾的".
根據類型來找, find -type
> find . -type f -name "*.log" -print
上述範例是要"印出所有當前路徑下, 類型是"檔案", 且名字以 .log 結尾的. -type
常用的參數, 如下,
`d` 目錄
`p` 具名的 pipe
`f` 一般檔案
`l` 連結檔
`s` socket
排除特定路徑,
> find . -path "./test" -prune -o -print
//印出所有當前目錄下, 除了在路徑./test 下的檔案.
這是因為 -prune
條件成立時, 總是傳回 true
, 且條件是目錄時不會往下處理, 故可以利用 -o
來造成判斷的捷徑.
舉上例來說, 當比對到 “./test” 時, 傳回 true
. 而後面是邏輯 OR 運算, 不管後面是 true
或 false
, 結果都會是 true
, 所以就不用再判斷, 也不用做下去. 因此, -o
之後的 -print
不會被執行到. 但當比對的不吻合 “./test”, 傳回 false
, 而可繼續執行其後的條件判斷.
如果不使用 -prune
, 則只有路徑完全一樣的, 才會被排除掉.
> find . -path "./test" -o -print
//印出所有當前目錄下, 除了路徑是 "./test",
//所以如果檔案路徑是"./test/a.txt" 則會被印出,
//但路徑 "./test" 不會被印出.
所以, 以下與使用 -prune
約略等效,
> find . -path "./test/*" -o -print
//印出所有當前目錄下, 除了路徑吻合 "./test/" 檔案(注意, 最後有斜線).
//但 "./test"(注意, 最後沒有斜線) 本身會印出來
依檔案的時間來找, 可用的參數, 如下
-mtime n 檔案的最後修改時間, 單位是天.
-mmin n 檔案的最後修改時間, 單位是分鐘.
-atime n 檔案的最後存取時間, 單位是天.
-amin n 檔案的最後存取時間, 單位是分鐘
-ctime n 檔案狀態相關資訊最後修改的時間, 單位是天.
-cmin n 檔案狀態相關資訊最後修改的時間, 單位是分鐘.
簡單來說, 後面接"time"的單位是天, 接"min"的是分鐘. 時間都是從現在開始往前(過去)推的. 然後, 從推定的時間點, 之前就用+
, 之後用 -
. 例如, 如果現在是 2016-07-06 12:00:00 則 -mtime +1
就是說距現在 1天的時間點, 也就是 2016-07-05 12:00:00 之前被修改過的檔案.而 -mtime -1
是指 2016-07-05 12:00:00 之後到現在被修改過的檔案. 簡言之, -mtime +1
可以翻譯成 1 天前被修改過的檔案. -mtime -1
可以翻譯成 1 天內被修改過的檔案.
前面接"m"的是指被修改過. 接"a"是指被存取過(一般而言有被修改當然就有被存取, 但也有不先讀取資料就直接改變檔案內容的方法). 接"c"是指雖然沒被存取, 但有改變權限, 群組, 所有人或修改時間之類的(修改算狀態變動, 但存取不算).
依檔案的大小來找,
> find . -size 30M -print
//印出所有當前目錄下, 檔案大小等於 30M 的檔案.
// -size n[cwbkMG]
`b` blocks 一般為 512-byte
`c` bytes
`w` 1 個 word 等於 2 個 bytes
`k` Kilobytes (等於 1024 bytes)
`M` Megabytes (等於 1048576 bytes)
`G` for Gigabytes (等於 1073741824 bytes)
+
是大於, -
是小於, 例如: -size +30M
檔案大於 30M 的檔案.
找檔案用 find
, 找內容用 grep
. 接下來介紹 grep
, 大誤 要會熟用 grep
要學會正規表達式(regex), 但沒打算在這一併介紹. 目前只要知道 grep
命令的參數格式, Usage: grep [OPTION]... PATTERN [FILE]...
簡單說明, grep -l
能讓你只印出檔名, 而不是內容比對吻合的文字. xargs -i
來幫你填入參數, 用{}指定位置.
利用 find
過濾要找的檔案範圍, 利用管道 |
將找到的檔名交給 grep
分析內容. 然後印出有吻合 grep
指令所給定 PATTERN 內容的檔名.
> find ./ -type f | xargs -i grep -l 'target' {}
// 利用 `xargs` 把 `find` 找到的檔名填入"{}"處
現在, 你也可以自製一個桌面板的 Google 搜尋了. :P
find
, 再者 grep
.find
功力強大, 能幫助你找到檔案, 但並不能幫助你找到檔案內有甚麼? 簡單的介紹用法, 如下.> find . -name "*.log" -print
//find -name -print
//find 後面接要搜尋的路徑, -name 後面接要比對的模式, 用 -print 將找到的檔案印出
find
命令後的表達式, 主要可以區分 測試(Tests), 行動(Actions), 關聯操作(Operators) 等部分.true
或 false
., 例如:
-print`指示將找到的路徑列印出來.-o
意指 OR, -a
意指 AND. 沒指定就是-a
.> find . -name "*.log" -print
find -type
> find . -type f -name "*.log" -print
-type
常用的參數, 如下,`d` 目錄
`p` 具名的 pipe
`f` 一般檔案
`l` 連結檔
`s` socket
> find . -path "./test" -prune -o -print
//印出所有當前目錄下, 除了在路徑./test 下的檔案.
-prune
條件成立時, 總是傳回 true
, 且條件是目錄時不會往下處理, 故可以利用 -o
來造成判斷的捷徑.舉上例來說, 當比對到 “./test” 時, 傳回
true
. 而後面是邏輯 OR 運算, 不管後面是 true
或 false
, 結果都會是 true
, 所以就不用再判斷, 也不用做下去. 因此, -o
之後的 -print
不會被執行到. 但當比對的不吻合 “./test”, 傳回 false
, 而可繼續執行其後的條件判斷.-prune
, 則只有路徑完全一樣的, 才會被排除掉.> find . -path "./test" -o -print
//印出所有當前目錄下, 除了路徑是 "./test",
//所以如果檔案路徑是"./test/a.txt" 則會被印出,
//但路徑 "./test" 不會被印出.
-prune
約略等效,> find . -path "./test/*" -o -print
//印出所有當前目錄下, 除了路徑吻合 "./test/" 檔案(注意, 最後有斜線).
//但 "./test"(注意, 最後沒有斜線) 本身會印出來
-mtime n 檔案的最後修改時間, 單位是天.
-mmin n 檔案的最後修改時間, 單位是分鐘.
-atime n 檔案的最後存取時間, 單位是天.
-amin n 檔案的最後存取時間, 單位是分鐘
-ctime n 檔案狀態相關資訊最後修改的時間, 單位是天.
-cmin n 檔案狀態相關資訊最後修改的時間, 單位是分鐘.
+
, 之後用 -
. 例如, 如果現在是 2016-07-06 12:00:00 則 -mtime +1
就是說距現在 1天的時間點, 也就是 2016-07-05 12:00:00 之前被修改過的檔案.而 -mtime -1
是指 2016-07-05 12:00:00 之後到現在被修改過的檔案. 簡言之, -mtime +1
可以翻譯成 1 天前被修改過的檔案. -mtime -1
可以翻譯成 1 天內被修改過的檔案.> find . -size 30M -print
//印出所有當前目錄下, 檔案大小等於 30M 的檔案.
// -size n[cwbkMG]
`b` blocks 一般為 512-byte
`c` bytes
`w` 1 個 word 等於 2 個 bytes
`k` Kilobytes (等於 1024 bytes)
`M` Megabytes (等於 1048576 bytes)
`G` for Gigabytes (等於 1073741824 bytes)
+
是大於, -
是小於, 例如: -size +30M
檔案大於 30M 的檔案.find
, 找內容用 grep
. 接下來介紹 grep
, grep
要學會正規表達式(regex), 但沒打算在這一併介紹. 目前只要知道 grep
命令的參數格式, Usage: grep [OPTION]... PATTERN [FILE]...
grep -l
能讓你只印出檔名, 而不是內容比對吻合的文字. xargs -i
來幫你填入參數, 用{}指定位置.find
過濾要找的檔案範圍, 利用管道 |
將找到的檔名交給 grep
分析內容. 然後印出有吻合 grep
指令所給定 PATTERN 內容的檔名.> find ./ -type f | xargs -i grep -l 'target' {}
// 利用 `xargs` 把 `find` 找到的檔名填入"{}"處
沒有留言:
張貼留言