Linux find 尋找檔案/尋找資料夾用法與範例

本篇 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 bytes
k: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 下載檔案用法與範例