本篇 ShengYu 將介紹如何使用 Linux find 指令來尋找檔案或尋找資料夾用法與範例,並且 find 找到的檔案同時進行移動mv / 複製cp / 刪除rm / 搜尋grep / 取代sed,學習這些技巧將會大大的提升處理檔案的效率。
以下 Linux find 指令介紹將分為這幾部份,
- find 基本用法
- find 找到特定檔案後,並且移動mv這些檔案
- find 找到特定檔案後,並且移動複製cp這些檔案
- find 找到特定檔案後,並且移動刪除rm這些檔案
- find 找到特定檔案後,並且搜尋grep這些檔案內的文字
- find 找到特定檔案後,並且取代sed這些檔案內的文字
- find 根據檔案大小來找
- find 根據檔案修改日期來找
- find 排除目錄或排除多個目錄
- find 計算找到的檔案數量
那我們開始吧!
find 基本用法
這邊介紹 find 尋找檔案或尋找資料夾的基本用法,在 Linux 或 macOS 下用 find 指令尋找檔案指令如下,例如要找 hello.txt 檔案的話,find 指令可以這樣用,1
$ find ./ -name "hello.txt"
如果要不區分大小寫的話,可以用 -iname
這個選項,像這樣用,1
$ find ./ -iname "hello.txt"
這樣不管是 hello.txt 或 Hello.txt 或 HELLO.txt 都可以找得出來,
如果想用 find 找包含 foo 關鍵字的檔案可以這樣用,1
$ find ./ -name "*foo*"
但是這樣的結果會找出符合的檔案與資料夾,如果只想找出檔案不想找出資料夾的話可以另外加上 -type
選項,-type f
是找檔案,-type d
是找資料夾,預設都不加的話就是就是兩種結果都會列出來。
用 find 指令找當下目錄有包含 “foo” 關鍵字的 “檔案” 用法如下,1
2
3
4
5$ find ./ -name "*foo*" -type f
# -type f 找檔案
# -type d 找目錄
# 不加 -type 就是兩種結果都會列出來
find 指令找當下目錄有包含 “foo” 關鍵字的 “目錄” 用法如下,1
$ find ./ -name "*foo*" -type d
find 找到特定檔案後,並且移動mv這些檔案
這邊示範用 find 指令找到特定檔案後,並且移動mv這些檔案,有以下這幾種範例,1
2
3
4
5
6
7
8# 把當下目錄有 "foo" 關鍵字檔名移動到 bar 資料夾
$ find ./ -name "*foo*" -type f | xargs -i mv {} bar
# 如果找到的檔案名稱包含空白需加上 -print0
$ find ./ -name "*foo*" -type f -print0 | xargs -0 -i mv {} bar
# 找到C程式檔類型的 並移動到C資料夾
$ file * | grep "C source" | awk '{print $1}' | cut -d':' -f1 | xargs ls | xargs -i mv {} C/
find 找到特定檔案後,並且移動複製cp這些檔案
這邊示範用 find 指令找到特定檔案後,並且複製cp這些檔案,1
2# 把當下目錄有 "foo" 關鍵字檔名複製到 bar 資料夾
$ find ./ -name "*foo*" -type f | xargs -i cp {} bar
find 找到特定檔案後,並且移動刪除rm這些檔案
這邊示範用 find 指令找到特定檔案後,並且刪除rm這些檔案,有以下這幾種範例,1
2
3
4
5
6
7
8# 把當下目錄有 "foo" 關鍵字檔名給刪除
$ find ./ -name "*foo*" -type f | xargs rm
# 找到 *.mht 檔案 並刪掉(檔案名稱有空白或太長要加 -print0 選項)
$ find ./ -name "*.mht" -type f -print0 | xargs -0 rm
# 找出執行檔類型並刪掉
$ file * | grep "executable" | awk '{print $1}' | cut -d':' -f1 | xargs rm
find 找到特定檔案後,並且搜尋grep這些檔案內的文字
這邊介紹 find 指令找到特定檔案後,並且搜尋grep這些檔案內的文字,有時會需要 find 找到檔案後接著針對這些檔案去作 grep 檔案內的文字搜尋,這時候這個技巧就很實用了,有以下這幾種範例,1
2
3
4
5
6
7
8
9
10# 把當下目錄 cpp 檔中的 "main" 關鍵字找出來
$ find ./ -name "*.cpp" -print0 | xargs -0 grep -r "main" --color
$ find ./ -name "*.cpp" -print0 | xargs -0 ag "main"
# 將兩類別關鍵字的檔案 (*.cpp 檔和 *.h 檔) 找出來進行搜尋
$ find ./ \( -name "*.cpp" -o -name "*.h" \) -print0 | xargs -0 grep "stdio"
$ find ./ \( -name "*.cpp" -o -name "*.h" \) -print0 | xargs -0 ag "stdio"
# 找出執行檔類型
$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'
根據上例子,找到特定檔案後,並且搜尋 grep 這些檔案內的文字,假如有搜尋到特定文字的話在作移動mv / 複製cp / 刪除rm這些檔案,這是進階中的進階技巧了!1
2
3
4
5
6
7
8# 把當下目錄 cpp 檔內容中包含 "main" 關鍵字的檔案找出來後移動mv檔案到 out 資料夾
$ find ./ -name "*.cpp" -print0 | xargs -0 grep -rIl "main" | xargs -i mv {} out
# 把當下目錄 cpp 檔內容中包含 "main" 關鍵字的檔案找出來後複製cp檔案到 out 資料夾
$ find ./ -name "*.cpp" -print0 | xargs -0 grep -rIl "main" | xargs -i cp {} out
# 把當下目錄 cpp 檔內容中包含 "main" 關鍵字的檔案找出來後刪除rm
$ find ./ -name "*.cpp" -print0 | xargs -0 grep -rIl "main" | xargs rm
find 找到特定檔案後,並且取代sed這些檔案內的文字
這邊示範用 find 找到特定檔案後,並且取代sed這些檔案內的文字,1
2# 把當下目錄 cpp 檔案找出來後用sed將檔案內容的 "foo" 取代成 "bar"
$ find ./ -name "*.cpp" -print0 | xargs -0 sed -i 's/foo/bar/g'
find 根據檔案大小來找
這邊示範根據檔案大小來找,尤其是在硬碟空間不足時要清理垃圾時特別容易使用到XD
找出單檔大於500M的檔案,1
$ find ./ -size +500M
找出單檔大於2G的檔案,1
2
3$ find ./ -size +2G
or
$ find ./ -size +2048M
找出單檔小於160k的照片並且刪除,1
$ find ./ -name "*.jpg" -size -160k -delete
找出單檔大於160k的照片並且刪除.1
$ find ./ -name "*.jpg" -size +160k -delete
這邊整理一下其他單位使用,c
:for bytesk
:for Kilobytes (units of 1024 bytes)M
:for Megabytes (units of 1048576 bytes)G
:for Gigabytes (units of 1073741824 bytes)
find 根據檔案修改日期來找
用 find 指令尋找當前目錄下在 5 分鐘以內變動過的所有檔案,1
find ./ -type f -mmin -5
用 find 指令尋找當前目錄下超過 5 分鐘以上變動過的所有檔案,同時也是 5 分鐘內沒有變動過的所有檔案,1
find ./ -type f -mmin +5
用 find 指令尋找當前目錄下最後 5 分鐘到 10 分鐘內變動過的所有檔案,1
find ./ -type f -mmin +5 -mmin -10
用 find 指令尋找當前目錄下 3 天內變動過的所有檔案,1
find ./ -type f -mtime -3
這邊整理一下這幾個選項的差異,amin
:檔案的最後存取時間(last access),時間單位為分鐘atime
:檔案的最後存取時間(last access),時間單位為天cmin
:檔案的狀態資訊最後修改的時間(last change),時間單位為分鐘ctime
:檔案的狀態資訊最後修改的時間(last change),時間單位為天mmin
:檔案的最後修改時間(last modify),時間單位為分鐘mtime
:檔案的最後修改時間(last modify),時間單位為天
find 排除目錄或排除多個目錄
這邊示範 find 排除目錄的語法,先介紹排除單一目錄,假如 find txt 文字檔時要排除當前 test 目錄,指令如下,1
find ./ -name "*.txt" -path "./test" -prune -o -print
排除多個目錄的話,例如排除當前 test 與 tools 目錄,指令如下,1
find ./ -name "*.txt" -path "./test" -prune -o -path "./tools" -prune -o -print
排除 2 個以上目錄的指令就依此類推
find 計算找到的檔案數量
如果想要計算 find 找到檔案結果的數量的話可以配合 wc 這個指令,這邊示範找當前目錄下副檔名為 jpg 的檔案數量,1
$ find ./ -name "*.jpg" | wc -l
其它相關文章推薦
Linux 常用指令教學懶人包
Linux cut 字串處理用法與範例
Linux sed 字串取代用法與範例
Linux grep/ack/ag 搜尋字串用法與範例
Linux du 查詢硬碟剩餘空間/資料夾容量用法與範例
Linux wget 下載檔案用法與範例