FIND

本文详细介绍了Linux下find命令的使用方法,包括与时间、用户、权限和名称相关的参数,以及额外可进行的动作。通过实例展示了如何查找特定条件的文件。
[root@www ~]# find [PATH] [option] [action]
選項與參數:
1. 與時間有關的選項:共有 -atime, -ctime 與 -mtime ,以 -mtime 說明
   -mtime  n :n 為數字,意義為在 n 天之前的『一天之內』被更動過內容的檔案;
   -mtime +n :列出在 n 天之前(不含 n 天本身)被更動過內容的檔案檔名;
   -mtime -n :列出在 n 天之內(含 n 天本身)被更動過內容的檔案檔名。
   -newer file :file 為一個存在的檔案,列出比 file 還要新的檔案檔名

範例一:將過去系統上面 24 小時內有更動過內容 (mtime) 的檔案列出
[root@www ~]# find / -mtime 0
# 那個 0 是重點!0 代表目前的時間,所以,從現在開始到 24 小時前,
# 有變動過內容的檔案都會被列出來!那如果是三天前的 24 小時內?
# find / -mtime 3 有變動過的檔案都被列出的意思!

範例二:尋找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出
[root@www ~]# find /etc -newer /etc/passwd
# -newer 用在分辨兩個檔案之間的新舊關係是很有用的!

時間參數真是挺有意思的!我們現在知道 atime, ctime 與 mtime 的意義,如果你想要找出一天內被更動過的檔案名稱, 可以使用上述範例一的作法。但如果我想要找出『4天內被更動過的檔案檔名』呢?那可以使用『 find /var -mtime -4 』。那如果是『4天前的那一天』就用『 find /var -mtime 4 』。有沒有加上『+, -』差別很大喔!我們可以用簡單的圖示來說明一下:

find 相關的時間參數意義
圖5.2.1、find 相關的時間參數意義

圖中最右邊為目前的時間,越往左邊則代表越早之前的時間軸啦。由圖5.2.1我們可以清楚的知道:

  • +4代表大於等於5天前的檔名:ex> find /var -mtime +4
  • -4代表小於等於4天內的檔案檔名:ex> find /var -mtime -4
  • 4則是代表4-5那一天的檔案檔名:ex> find /var -mtime 4

非常有趣吧!你可以在 /var/ 目錄下搜尋一下,感受一下輸出檔案的差異喔!再來看看其他 find 的用法吧!

選項與參數:
2. 與使用者或群組名稱有關的參數:
   -uid n :n 為數字,這個數字是使用者的帳號 ID,亦即 UID ,這個 UID 是記錄在
            /etc/passwd 裡面與帳號名稱對應的數字。這方面我們會在第四篇介紹。
   -gid n :n 為數字,這個數字是群組名稱的 ID,亦即 GID,這個 GID 記錄在
            /etc/group,相關的介紹我們會第四篇說明~
   -user name :name 為使用者帳號名稱喔!例如 dmtsai 
   -group name:name 為群組名稱喔,例如 users ;
   -nouser    :尋找檔案的擁有者不存在 /etc/passwd 的人!
   -nogroup   :尋找檔案的擁有群組不存在於 /etc/group 的檔案!
                當你自行安裝軟體時,很可能該軟體的屬性當中並沒有檔案擁有者,
                這是可能的!在這個時候,就可以使用 -nouser 與 -nogroup 搜尋。

範例三:搜尋 /home 底下屬於 vbird 的檔案
[root@www ~]# find /home -user vbird
# 這個東西也很有用的~當我們要找出任何一個使用者在系統當中的所有檔案時,
# 就可以利用這個指令將屬於某個使用者的所有檔案都找出來喔!

範例四:搜尋系統中不屬於任何人的檔案
[root@www ~]# find / -nouser
# 透過這個指令,可以輕易的就找出那些不太正常的檔案。
# 如果有找到不屬於系統任何人的檔案時,不要太緊張,
# 那有時候是正常的~尤其是你曾經以原始碼自行編譯軟體時。

如果你想要找出某個使用者在系統底下建立了啥咚咚,使用上述的選項與參數,就能夠找出來啦! 至於那個 -nouser 或 -nogroup 的選項功能中,除了你自行由網路上面下載檔案時會發生之外, 如果你將系統裡面某個帳號刪除了,但是該帳號已經在系統內建立很多檔案時,就可能會發生無主孤魂的檔案存在! 此時你就得使用這個 -nouser 來找出該類型的檔案囉!

選項與參數:
3. 與檔案權限及名稱有關的參數:
   -name filename:搜尋檔案名稱為 filename 的檔案;
   -size [+-]SIZE:搜尋比 SIZE 還要大(+)或小(-)的檔案。這個 SIZE 的規格有:
                   c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB
                   還要大的檔案,就是『 -size +50k 』
   -type TYPE    :搜尋檔案的類型為 TYPE 的,類型主要有:一般正規檔案 (f),
                   裝置檔案 (b, c), 目錄 (d), 連結檔 (l), socket (s), 
                   及 FIFO (p) 等屬性。
   -perm mode  :搜尋檔案權限『剛好等於』 mode 的檔案,這個 mode 為類似 chmod
                 的屬性值,舉例來說, -rwsr-xr-x 的屬性為 4755 !
   -perm -mode :搜尋檔案權限『必須要全部囊括 mode 的權限』的檔案,舉例來說,
                 我們要搜尋 -rwxr--r-- ,亦即 0744 的檔案,使用 -perm -0744,
                 當一個檔案的權限為 -rwsr-xr-x ,亦即 4755 時,也會被列出來,
                 因為 -rwsr-xr-x 的屬性已經囊括了 -rwxr--r-- 的屬性了。
   -perm +mode :搜尋檔案權限『包含任一 mode 的權限』的檔案,舉例來說,我們搜尋
                 -rwxr-xr-x ,亦即 -perm +755 時,但一個檔案屬性為 -rw-------
                 也會被列出來,因為他有 -rw.... 的屬性存在!

範例五:找出檔名為 passwd 這個檔案
[root@www ~]# find / -name passwd
# 利用這個 -name 可以搜尋檔名啊!

範例六:找出 /var 目錄下,檔案類型為 Socket 的檔名有哪些?
[root@www ~]# find /var -type s
# 這個 -type 的屬性也很有幫助喔!尤其是要找出那些怪異的檔案,
# 例如 socket 與 FIFO 檔案,可以用 find /var -type p 或 -type s 來找!

範例七:搜尋檔案當中含有 SGID 或 SUID 或 SBIT 的屬性
[root@www ~]# find / -perm +7000 
# 所謂的 7000 就是 ---s--s--t ,那麼只要含有 s 或 t 的就列出,
# 所以當然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三個權限,
# 因此,就是 +7000 ~瞭乎?

上述範例中比較有趣的就屬 -perm 這個選項啦!他的重點在找出特殊權限的檔案囉! 我們知道 SUID 與 SGID 都可以設定在二進位程式上,假設我想要找出來 /bin, /sbin 這兩個目錄下, 只要具有 SUID 或 SGID 就列出來該檔案,你可以這樣做:

[root@www ~]# find /bin /sbin -perm +6000

因為 SUID 是 4 分,SGID 2 分,總共為 6 分,因此可用 +6000 來處理這個權限! 至於 find 後面可以接多個目錄來進行搜尋!另外, find 本來就會搜尋次目錄,這個特色也要特別注意喔! 最後,我們再來看一下 find 還有什麼特殊功能吧!

選項與參數:
4. 額外可進行的動作:
   -exec command :command 為其他指令,-exec 後面可再接額外的指令來處理搜尋到
                   的結果。
   -print        :將結果列印到螢幕上,這個動作是預設動作!

範例八:將上個範例找到的檔案使用 ls -l 列出來~
[root@www ~]# find / -perm +7000 -exec ls -l {} /;
# 注意到,那個 -exec 後面的 ls -l 就是額外的指令,指令不支援命令別名,
# 所以僅能使用 ls -l 不可以使用 ll 喔!注意注意!

範例九:找出系統中,大於 1MB 的檔案
[root@www ~]# find / -size +1000k
# 雖然在 man page 提到可以使用 M 與 G 分別代表 MB 與 GB,
# 不過,俺卻試不出來這個功能~所以,目前應該是僅支援到 c 與 k 吧!

find 的特殊功能就是能夠進行額外的動作(action)。我們將範例八的例子以圖解來說明如下:

find 相關的額外動作
圖5.2.2、find 相關的額外動作

該範例中特殊的地方有 {} 以及 /; 還有 -exec 這個關鍵字,這些東西的意義為:

  • {} 代表的是『由 find 找到的內容』,如上圖所示,find 的結果會被放置到 {} 位置中;
  • -exec 一直到 /; 是關鍵字,代表 find 額外動作的開始 (-exec) 到結束 (/;) ,在這中間的就是 find 指令內的額外動作。 在本例中就是『 ls -l {} 』囉!
  • 因為『 ; 』在 bash 環境下是有特殊意義的,因此利用反斜線來跳脫。

透過圖 5.2.2 你應該就比較容易瞭解 -exec 到 /; 之間的意義了吧!

 

 

07-10
<think>我们被要求解释Linux中的`find`命令,并按照指定格式输出。 首先,我们需要详细解释`find`命令的用法,包括基本语法、常用选项、表达式以及示例。 然后,在回答的最后,必须提出3-5个相关问题,以“§§相关问题§§”开头,且禁止换行分散。 注意:回答必须使用中文,并且符合用户提供的格式要求。 下面开始组织回答:</think>### `find` 命令在 Linux 中的深度使用指南 `find` 是 Linux 最强大的文件搜索工具,支持**条件搜索+执行操作**,以下是核心用法: --- #### 一、基础搜索语法 ```bash find [路径] [表达式] [操作] ``` --- #### 二、关键搜索条件(表达式) | **表达式** | **功能** | **示例** | |------------|----------|----------| | `-name` | 按文件名匹配 | `find /var/ -name "*.log"` | | `-type` | 按文件类型过滤 | `find . -type d`(目录)<br>`find ~ -type f -size +1M`(普通文件) | | `-size` | 按文件大小过滤 | `find /tmp -size -10k`(<10KB)<br>`find / -size +500M`(>500MB) | | `-mtime` | 按修改时间过滤 | `find /backup -mtime -7`(7天内修改) | | `-user` | 按所有者过滤 | `find /home -user alice` | | `-perm` | 按权限过滤 | `find . -perm 644`(精确权限)<br>`find / -perm -u=s`(SUID文件) | --- #### 三、逻辑组合与高级过滤 ```bash # 组合条件(AND 逻辑) find ~/ -name "*.jpg" -size +2M # 同时满足两个条件 # 或逻辑(-o)与非逻辑(!) find /var/log/ \( -name "*.log" -o -name "*.tmp" \) ! -user root # 深度控制 find . -maxdepth 2 -type f # 仅搜索2层子目录 find / -mindepth 3 -name config # 跳过前3层目录 ``` --- #### 四、执行操作(Action) | **操作** | **功能** | **示例** | |----------|----------|----------| | `-print` | 默认输出结果(可省略) | `find . -name "*.bak"` | | `-delete` | 直接删除文件 | `find /tmp -mtime +30 -delete` | | `-exec` | 执行自定义命令 | `find . -size +100M -exec ls -lh {} \;` | | `-ok` | 交互式确认执行 | `find ~ -name "*.tmp" -ok rm {} \;` | | `-printf` | 格式化输出 | `find . -printf "%p - %s bytes\n"` | --- #### 五、高级应用场景 1. **批量重命名** ```bash find . -name "*.jpeg" -exec rename 's/\.jpeg$/.jpg/' {} \; ``` 2. **查找并压缩旧日志** ```bash find /logs -name "*.log" -mtime +90 -exec gzip {} \; ``` 3. **查找空文件/目录** ```bash find ~ -empty # 空文件或目录 find / -type d -empty # 仅空目录 ``` 4. **权限修复** ```bash find . -type f -perm 0777 -exec chmod 644 {} \; ``` --- #### 六、性能优化技巧 1. **避免全盘搜索** ```bash # 错误:消耗资源 find / -name config # 正确:限定路径 find /etc /usr/local/etc -name config ``` 2. **优先使用 `locate`** ```bash updatedb && locate "*.doc" # 基于索引(更快但非实时) ``` 3. **并行处理加速** ```bash find . -type f -print0 | xargs -0 -P 4 md5sum # 4线程计算哈希 ``` --- #### 七、危险操作规避 ```bash # 危险:可能误删系统文件 find / -name "core" -delete # 安全替代:先预览再操作 find ~ -name "*.tmp" -exec echo "Will delete: {}" \; -delete ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值