跳到主內容

使用 Linux find 尋找檔案/尋找資料夾

基本用法. Linux 用 find 尋找檔案或尋找資料夾

  • 範例1. 找到特定檔案後,並且移動mv/複製cp/刪除rm這些檔案
  • 範例2. 找到特定檔案後,並且搜尋grep這些檔案內的文字
  • 範例3. 根據檔案大小來找
  • 範例4. 根據檔案修改日期來找
  • 範例5. 計算找到的檔案數量

基本用法. Linux 用 find 尋找檔案或尋找資料夾 在 Linux 或 macOS 下用 find 指令尋找檔案指令如下,-type f是找檔案,-type d是找資料夾, 都不加的話,就是就是兩種結果都會列出來。

這邊示範用 find 指令找當下目錄有 “foo” 關鍵字的 “檔案”,

$ find ./ -name "*foo*" -type f

# -type f 找檔案
# -type d 找目錄
# 不加 -type 就是兩種結果都會列出來

find 指令找當下目錄有 “foo” 關鍵字的 “目錄”,

$ find ./ -name "*foo*" -type d

範例1. 找到特定檔案後,並且移動mv/複製cp/刪除rm這些檔案

範例1-1. 找到特定檔案後,並且移動mv這些檔案

這邊示範用 find 指令找到特定檔案後,並且移動mv這些檔案,


# 把當下目錄有 "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/

範例1-2. 找到特定檔案後,並且複製cp這些檔案

這邊示範用 find 指令找到特定檔案後,並且複製cp這些檔案,

# 把當下目錄有 "foo" 關鍵字檔名複製到 bar 資料夾
$ find ./ -name "*foo*" -type f | xargs -i cp {} bar

範例1-3. 找到特定檔案後,並且刪除rm這些檔案

這邊示範用 find 指令找到特定檔案後,並且刪除rm這些檔案,

# 把當下目錄有 "foo" 關鍵字檔名給刪除
$ find ./ -name "*foo*" -type f | xargs rm

# 找到 *.mht 檔案 並刪掉(檔名有空白或太長)
$ find ./ -name "*.mht" -type f -print0 | xargs -0 rm

# 找到執行檔類型的 並刪掉
$ file * | grep "executable" | awk '{print $1}' | cut -d':' -f1 | xargs rm

範例2. 找到特定檔案後,並且搜尋grep這些檔案內的文字

範例2-1. 找到特定檔案後,並且搜尋grep這些檔案內的文字

有時會需要找到檔案後接著針對這些檔案去作grep檔案內的文字搜尋,

# 把當下目錄 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 ag "stdio"

# find the binary files
$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

範例2-2. 找到特定檔案後,並且搜尋grep這些檔案內的文字,假如有搜尋到特定文字的話在作移動mv/複製cp/刪除rm這些檔案這是進階中的進階技巧了!

# 把當下目錄 cpp 檔中包含 "main" 關鍵字的檔案找出來後移動檔案到 out
$ find ./ -name "*.cpp" -print0 | xargs -0 grep -rIl "main" | xargs -i mv {} out

# 把當下目錄 cpp 檔中包含 "main" 關鍵字的檔案找出來後複製檔案到 out
$ find ./ -name "*.cpp" -print0 | xargs -0 grep -rIl "main" | xargs -i cp {} out

# 把當下目錄 cpp 檔中包含 "main" 關鍵字的檔案找出來後刪除
$ find ./ -name "*.cpp" -print0 | xargs -0 grep -rIl "main" | xargs rm

範例3. 根據檔案大小來找

這邊示範根據檔案大小來找,尤其是在硬碟空間不足時要清理垃圾時特別容易使用到XD找出單檔大於500M的檔案,

$ find ./ -size +500M

找出單檔大於2G的檔案,

$ find ./ -size +2G
or
$ find ./ -size +2048M

找出單檔小於160k的照片並且刪除,

$ find ./ -name "*.jpg" -size -160k -delete

找出單檔大於160k的照片並且刪除.

$ 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)

範例4. 根據檔案修改日期來找

用 find 指令尋找當前目錄下在 5 分鐘以內變動過的所有檔案,

find ./ -type f -mmin -5

用 find 指令尋找當前目錄下超過 5 分鐘以上變動過的所有檔案,同時也是 5 分鐘內沒有變動過的所有檔案

find ./ -type f -mmin +5

用 find 指令尋找當前目錄下最後 5 分鐘到 10 分鐘內變動過的所有檔案,

find ./ -type f -mmin +5 -mmin -10

用 find 指令尋找當前目錄下 3 天內變動過的所有檔案,

find ./ -type f -mtime -3

這邊整理一下這幾個選項的差異,

  • amin:檔案的最後存取時間(last access),時間單位為分鐘
  • atime:檔案的最後存取時間(last access),時間單位為天
  • cmin:檔案的狀態資訊最後修改的時間(last change),時間單位為分鐘
  • ctime:檔案的狀態資訊最後修改的時間(last change),時間單位為天
  • mmin:檔案的最後修改時間(last modify),時間單位為分鐘
  • mtime:檔案的最後修改時間(last modify),時間單位為天

範例5. 計算找到的檔案數量

如果想要計算 find 找到檔案結果的數量的話可以配合 wc 這個指令,這邊示範找當前目錄下副檔名為 jpg 的檔案數量,

$ find ./ -name "*.jpg" | wc -l
  • 查詢過去有異動過檔案

    • -mtime 搜尋檔案的修改時間(天)
    • -mmin 搜尋檔案的修改時間(分鐘)
    • -ctime 搜尋檔案的建立時間(天)
    • -cmin 搜尋檔案的建立時間(分鐘)
    • -atime 搜尋檔案的最後開啟時間(天)
    • -amin 搜尋檔案的最後開啟時間(分鐘)
find ./ -mtime 3 # 在當前目錄下搜尋3天時修改的檔案
find ./ -mtime +3 # 在當前目錄下搜尋3天前修改的檔案
find ./ -mtime -3 # 在當前目錄下搜尋3天內修改的檔案
  • 排除目錄或檔案

如果是要排除目錄時,目錄名稱後面不能加上「/」;但是如果是排除檔案時,就沒有關係。 例如:-path "/dir1/aa/" -prune -o -->因為aa是一個目錄,所以會無法排除

# 單目錄
find /dir1  -path "/dir1/aa"  -prune -o  -name "test*" -print

# 多目錄或檔案
find /dir1  -path "/dir1/aa" -prune -o -path "/dir1/bb" -prune -o  -name "test*" -print



參考相關網頁