使用 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