﻿# 在 Linux 下使用 find 指令查詢目錄與檔案的速查筆記

在 Linux 平台下找檔案不外乎使用威力強大的 [find](https://help.ubuntu.com/community/find) 命令，威力強大的背後就是有一點點學習曲線，不過整體上來說還算簡單，因此想寫一篇文章留下備忘，讓自己日後可以快速查閱參考。

**【 基本語法 】**

**查詢檔案名稱 ( 也可以查詢「目錄名稱」，其中 \* 是萬用字元 )**

```
find $HOME -name '*.mp3'
```

   **註1**: $HOME 是 Linux 下的一個環境變數，預設指向執行帳號的 HOME 目錄

**查詢檔案名稱 (不區分大小寫)**

```
find /etc -iname 'Network'
```

**指定只要搜尋「檔案」名稱**

```
find /var/log -iname '*.log' -type f
```

**指定只要搜尋「目錄」名稱**

```
find /etc -iname 'apache2' -type d
```

   **補充說明：可用的 –type 參數值如下**

> b      block (buffered) special
> 
> c      character (unbuffered) special
> 
> d      directory ( 一般目錄 )
> 
> p      named pipe (FIFO)
> 
> f      regular file ( 一般檔案 )
> 
> l      symbolic link
> 
> s      socket
> 
> D      door (Solaris)

**找尋所有檔案大小大於 50MB 的檔案**

```
find /var -type f -size +50M
```

   **註1**: 不加上 –name 參數即代表搜尋所有檔案

**找尋所有檔案大小小於 50MB 的檔案**

```
find /var -type f -size -50M
```

**尋找超過 7 天沒有被存取或修改過的檔案** (判斷檔案存取時間)

```
find $HOME -type f -atime +7
```

**尋找曾經在 7 天內被存取或修改過的檔案** (判斷檔案存取時間)

```
find $HOME -type f -atime -7
```

**尋找超過 10 分鐘沒有被存取或修改過的檔案** (判斷檔案存取時間)

```
find $HOME -type f -amin +10
```

**尋找曾經在 10 分鐘內被存取或修改過的檔案** (判斷檔案存取時間)

```
find $HOME -type f -amin -10
```

**尋找檔案建立時間已超過 30 天的檔案**

```
find $HOME -type f -ctime +30
```

**尋找特定使用者的檔案 (** 以帳號名稱 tom 為例 **)**

```
find $HOME -type f -user tom
```

**【 進階應用 】**

**刪除 30 天以上未經存取過的暫存檔**案 ( 注意: 以下指令最後一個分號(;)前一定要加上反斜線** **)****

```
find /tmp -type f -atime +30 -print -exec rm -f '{}' \;
```

   **註1**: 加上 –print 是為了讓被刪除的檔案檔名一併顯示在畫面上，這個參數可以省略   **註2**: 使用 –exec 會讓查詢到的每一個檔案路徑代入 ‘{}’ 位置，一個檔案會執行一遍 rm 命令

**刪除 30 天以上未經存取過的暫存檔**案 ( 使用 xargs 當成單一命令的參數** **)****

```
find /tmp -type f -print0 | xargs -0 rm -v
```

   **註1**: 加上 –print0 是為了讓輸出的結果不以「斷行字元」分隔，而改以 null 為結果的分隔字元   **註2**: 使用 xargs 命令加上 –0 是為了讓傳入的資料以 null 字元當成參數的分隔  
   **註3**: 使用 rm 命令加上 –v 是為了能顯示出被刪除的檔案名稱，這個參數可以省略   **註4**: 使用 xargs 會將所有 find 命令查到的檔案轉換成 rm 的參數列，如果檔案過多可能會執行失敗!  
   **註5**: 使用 xargs 可確保後面的程式 ( rm ) 只執行一次，所以理論上執行速度較快！

**相同參數需輸入多筆並且以「或」邏輯運算時要用 –o 參數串接起來**

例1：同時找兩種檔名樣式的檔案

```
find $HOME -name '*.mp3' -o -name '*.ogg'
```

例2：同時找兩個擁有者的檔案

```
find /usr/local -user user1 -o -user user2
```

**【 注意事項 】**

-   使用萬用字元時務必加上單引號( ' )  
      
    ！！以下是**錯誤示範**！！

\[user1@server ~\]# find $HOME -name \*.txt  
find: paths must precede expression  
Usage: find \[path...\] \[expression\]

**相關連結**

-   [find - Community Ubuntu Documentation](https://help.ubuntu.com/community/find)
