find linux 目錄深度_浪里淘沙,詳解Linux系統中Find命令的實用技巧

知了小巷:浪里淘沙,詳解Linux系統中Find命令的實用技巧。

5ba31cfbca01e982e5ee792802f08667.png

啊哈,找到了!

當我們需要在Linux系統上定位某個文件或目錄時,find命令通常是必備之選。

它使用起來非常簡單,但有許多不同的可選項,允許我們對要搜索的文件進行條件過濾。 下面的實例,將會展示如何使用find命令查找系統上的任何我們想要查找的內容。一旦我們知道如何在Linux中使用find命令,每個文件都只需要敲幾下鍵盤就搞定了。

753a84e00dfa71edb8ed33525b281e08.png

finding...

Linux 系統實驗版本:

$ cat /proc/version

Linux version 3.10.0-957.1.3.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 29 14:49:43 UTC 2018

1. 查找目錄

find命令后跟-type d選項,這將會使find只搜索目錄而忽略文件。

$ find /path/to/search -type d -name "name-of-dir"

$ find / -type d -name 'home'

/home/admin/escheduler-ui/dist.old/css/home

/home/admin/escheduler-ui/dist.old/js/home

/home/admin/escheduler-ui/dist.20191112/css/home

/home/admin/escheduler-ui/dist.20191112/js/home

/home/admin/escheduler-ui/dist/css/home

/home/admin/escheduler-ui/dist/js/home

2. 查找隱藏文件

$ find /path/to/search -name ".*"

$ find ~/ -name ".*"

/home/admin/.trash/.py3_monitor_yarn_flinkjobs.py

/home/admin/.sqlline

/home/admin/.bash_profile

/home/admin/.ansible

3. 查找超過指定大小的文件

需要用到-size選項

查找超過10MB大小的文件:

$ find /path/to/search -size +10M

$ find ~/ -size +10M

/home/admin/hive.zip

/home/admin/flink-1.7.2.zip

查找小于10MB大小的文件:

$ find /path/to/search -size -10M

$ find ~/ -size -10M

/home/admin/tt.sh

/home/admin/ss.sh

/home/admin/send_email.py

查找剛剛好10MB大小的文件:

$ find /path/to/search -size 10M

$ find ~/ -size 10M

/home/admin/elk/elasticsearch-6.2.3/lib/elasticsearch-6.2.3.jar

查找介于100MB到2GB大小之間的文件:

$ find /path/to/search -size +100M -size -2G

$ find ~/ -size +100M -size -2G

/home/admin/streamsets-datacollector-3.11.0/libexec/bootstrap-libs/cluster/streamsets-datacollector-mesos-bootstrap-3.11.0.jar

4. 查找指定文件中文件名列表的一個或多個文件

需要用到管道符grep;查找結果是非精確文件名。

$ find /path/to/search | grep -f filelist.txt

$ echo tt.sh > shlist.txt

$ echo ss.sh >> shlist.txt

$ find ~/ | grep -f shlist.txt

/home/admin/elk/kibana-7.3.0-linux-x86_64/data/headless_shell-linux

/home/admin/elk/kibana-7.3.0-linux-x86_64/data/headless_shell-linux/headless_shell

/home/admin/tt.sh

/home/admin/ss.sh

需要注意的是文件名稱中的“點”-. 會被忽略,下同:

$ echo 'tt.sh' > shlist2.txt

$ echo 'ss.sh' >> shlist2.txt

$ find ~/ | grep -f shlist2.txt

/home/admin/elk/kibana-7.3.0-linux-x86_64/data/headless_shell-linux

/home/admin/elk/kibana-7.3.0-linux-x86_64/data/headless_shell-linux/headless_shell

/home/admin/tt.sh

/home/admin/ss.sh

如果文件名稱由單引號,會什么都找不到,單引號也是文件名稱的一部分了:

$ echo "'tt.sh'" > shlist3.txt

$ echo "'ss.sh'" >> shlist3.txt

$ find ~/ | grep -f shlist3.txt

那怎樣做才能精確找到與shlist.txt所列出的文件名稱一模一樣的文件呢???

答案是在文件名中的“點”前面加上轉義字符"":

$ echo 'tt.sh' > shlist4.txt

$ echo 'ss.sh' >> shlist4.txt

$ find ~/ | grep -f shlist4.txt

/home/admin/tt.sh

/home/admin/ss.sh

5. 查找不在指定文件名列表范圍內的文件

-v的意思是“inverse match“即反向匹配。

$ find /path/to/search | grep -vf filelist.txt

$ find ~/ | grep -vf shlist4.txt

/home/admin/shlist.txt

/home/admin/shlist3.txt

/home/admin/shlist2.txt

/home/admin/shlist4.txt

6. 設置查找的深度-maxdepth

find命令默認情況下會遞歸查找文件夾和子文件夾,所有子文件夾都會查找一遍。

我們可以使用-maxdepth選項來指定遞歸查找的文件夾層次數。

如果是當前文件夾下面,參數設置為0,如果是當前文件夾+子文件夾+子子文件夾,參數設置為2,以此類推。

$ find . -maxdepth 0 -name "myfile.txt"

$ find ~/ -maxdepth 2 -name "shlist.txt"

/home/admin/shlist.txt

7. 查找空文件

使用empty選項。

$ find /path/to/search -type f -empty

$ find ~/ -type f -empty

/home/admin/hive-2.3.5/examples/files/empty1.txt

/home/admin/hive-2.3.5/examples/files/empty2.txt

/home/admin/hive-2.3.5/examples/files/nullfile.txt

查找空文件夾:

$ find /path/to/search -type d -empty

$ find ~/ -type d -empty

/home/admin/nginx/srcnginx

/home/admin/.npm/_cacache/tmp

/home/admin/.npm/_locks

如果想要一次性刪除空文件,可以使用-delete選項:

$ find /path/to/search -type f -empty -delete

8. 查找最大或比較大的文件夾或文件

$ find /path/to/search -type f -printf "%s%p" | sort -n | tail -1

$ find ~/ -type f -printf "%s%p" | sort -n | tail -1

1077105823 /home/admin/flink-1.7.2.zip

使用sort對文件的size進行排序,使用tail輸出排在前面的n個文件。

文件輸出的順序,是從小到大。

如果要查找最小或topN小的文件,使用head就可以了:

$ find ~/ -type f -printf "%s%p" | sort -n | tail -5

268435627 /home/admin/hadoop-2.8.5/logs/hadoop-admin-namenode-testbi-flink-72.zlxx.local.log.6

268435631 /home/admin/hadoop-2.8.5/logs/hadoop-admin-namenode-testbi-flink-72.zlxx.local.log.3

284513057 /home/admin/elk/elasticsearch-7.3.0-linux-x86_64.tar.gz

301452104 /home/admin/test/flink-1.7.2-bin-hadoop28-scala_2.11.tgz

1077105823 /home/admin/flink-1.7.2.zip

查找最大的文件夾,未遞歸包括子文件夾下文件的大小:

$ find /path/to/search -type d -printf "%s%p" | sort -n | tail -1

$ find ~/ -type d -printf "%s%p" | sort -n | tail -1

344064 /home/admin/elk/kibana-7.3.0-linux-x86_64/built_assets/.cache/ui_bundles/babel

9. 查找普通用戶能夠使用root權限執行的文件

setuid:"set user ID on execution" ,普通用戶能夠使用root權限執行的文件。

SUID:SUID權限僅對二進制程序(binary program)有效;執行者對于該程序需要具有x的可執行權限;本權限僅在執行該程序的過程中有效(run-time);執行者將具有該程序擁有者(owner)的權限。

SUID的目的是:讓本來沒有相應權限的用戶運行這個程序時,可以訪問他沒有權限訪問的資源。

有兩個選項:-user和-perm;-exec ls -l {} ;會輸出更多信息。

# find /path/to/search -user root -perm /4000

# find / -user root -perm /4000

/usr/bin/mount

/usr/bin/su

/usr/bin/passwd

...

# find /path/to/search -user root -perm /4000 -exec ls -l {} ;

# find / -user root -perm /4000 -exec ls -l {} ;

-rwsr-xr-x 1 root root 44320 Oct 31 2018 /usr/bin/mount

-rwsr-xr-x 1 root root 32208 Oct 31 2018 /usr/bin/su

-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

...

不指定用戶:

$ find /path/to/search -perm /4000

10. 查找設置了SGID的文件

SGID:SGID對二進制程序有用;程序執行者對于該程序來說,需具備x的權限;SGID主要用在目錄上。

和SUID一樣,只是SGID是獲得該程序所屬用戶組的權限。

例如:如果用戶在此目錄下具有w權限的話,若使用者在此目錄下建立新文件,則新文件的群組與此目錄的群組相同。

# find /path/to/search -perm /2000

# find / -perm /2000 -exec ls -l {} ;

-r-xr-sr-x. 1 root tty 15344 Jun 10 2014 /usr/bin/wall

-rwxr-sr-x 1 root tty 19624 Oct 31 2018 /usr/bin/write

---x--s--x 1 root nobody 382240 Apr 11 2018 /usr/bin/ssh-agent

...

設置了SUID或SGID的文件,結果看并不一定是同時滿足:

# find /path/to/search -perm /6000

# find / -perm /6000 -exec ls -l {} ;

---s--x--x 1 root root 147392 Oct 31 2018 /usr/bin/sudo

-rwsr-xr-x 1 root root 44320 Oct 31 2018 /usr/bin/mount

-rwsr-xr-x 1 root root 32208 Oct 31 2018 /usr/bin/su

-rwsr-xr-x 1 root root 32048 Oct 31 2018 /usr/bin/umount

-rwxr-sr-x 1 root tty 19624 Oct 31 2018 /usr/bin/write

11. 查找文件輸出的時候過濾掉"Permission denied"的文件

$ find / -name "myfile.txt" 2>%1 | grep -v "Permission denied"

# find / -name "ss.sh" 2>%1 | grep -v "Permission denied"

/home/admin/ss.sh

12. 查找最近一段時間內發生過變更的文件

-mtime選項指定一定天數。

最近30天:

$ find /path/to/search -type f -mtime -30

$ find ~/ -type f -mtime -30

/home/admin/.bash_history

/home/admin/flink-1.7.2/log/flink-admin-client-testbi-flink-72.zlxx.local.log

超過30天,就多啦:

$ find /path/to/search -type f -mtime +30

$ find ~/ -type f -mtime +30

/home/admin/.bash_profile

/home/admin/hive.zip

剛剛好30天,且輸出更多文件信息:

$ find /path/to/search -type f -mtime 30

$ find ~/ -type f -mtime 30 -exec ls -l {} ;

-rw-rw-r-- 1 admin admin 2864754 Dec 9 16:51 /home/admin/apache-cassandra-3.0.18/logs/system.log

-rw-rw-r-- 1 admin admin 1841736 Dec 9 16:51 /home/admin/apache-cassandra-3.0.18/logs/gc.log.0.current

-rw-rw-r-- 1 admin admin 7550190 Dec 9 16:51 /home/admin/apache-cassandra-3.0.18/logs/debug.log

13. 根據文件變更時間進行排序

$ find /path/to/search -printf "%T+%p" | sort

$ find ~/ -type f -mtime 30 -printf "%T+%p" | sort

2019-12-09+16:51:04.9282457790 /home/admin/apache-cassandra-3.0.18/logs/system.log

2019-12-09+16:51:04.9392455540 /home/admin/apache-cassandra-3.0.18/logs/debug.log

2019-12-09+16:51:05.2652388850 /home/admin/apache-cassandra-3.0.18/logs/gc.log.0.current

默認是從小到達,也就是業界標準ASC,如果想要DESC:

$ find ~/ -type f -mtime 30 -printf "%T+%p" | sort -r

2019-12-09+16:51:05.2652388850 /home/admin/apache-cassandra-3.0.18/logs/gc.log.0.current

2019-12-09+16:51:04.9392455540 /home/admin/apache-cassandra-3.0.18/logs/debug.log

2019-12-09+16:51:04.9282457790 /home/admin/apache-cassandra-3.0.18/logs/system.log

14. find命令與locate命令的區別

默認情況下,Linux系統并沒有locate命令:

$ locate ss.sh

-bash: locate: command not found

Linux locate命令用于查找符合條件的文檔,他會去保存文檔和目錄名稱的數據庫內,查找合乎范本樣式條件的文檔或目錄。

一般情況我們只需要輸入 locate your_file_name 即可查找指定文件。

locate與find 不同: find 是去硬盤找,locate 只在/var/lib/slocate資料庫中找。

locate的速度比find快,它并不是真的查找,而是查數據庫,一般文件數據庫在/var/lib/slocate/slocate.db中,所以locate的查找并不是實時的,而是以數據庫的更新為準,一般是系統自己維護,也可以手工升級數據庫 。

如果需要使用locate,可以進行以下操作:

# yum install mlocate -y

...

Installed:

mlocate.x86_64 0:0.26-8.el7

Complete!

# updatedb

$ locate ss.sh

/etc/profile.d/less.sh

/home/admin/ss.sh

類似like '%ss.sh'。

15. find命令執行時的CPU負載如何呢?

可以通過top命令監控find占用的資源情況,如果find的目錄比較多比較深的時候。

使用ionice命令可以優化減少IO資源的使用:

$ ionice -c3 -n7 find /path/to/search -name "myfile.txt"

$ ionice -c3 -n7 find ~/ -type f -mtime 30 -printf "%T+%p" | sort -r

ionice: ignoring given class data for idle class

2019-12-09+16:51:05.2652388850 /home/admin/apache-cassandra-3.0.18/logs/gc.log.0.current

2019-12-09+16:51:04.9392455540 /home/admin/apache-cassandra-3.0.18/logs/debug.log

2019-12-09+16:51:04.9282457790 /home/admin/apache-cassandra-3.0.18/logs/system.log

使用nice命令可以優化減少CPU資源的使用:

$ nice -n 19 find /path/to/search -name "myfile.txt"

$ nice -n19 find ~/ -type f -mtime 30 -printf "%T+%p" | sort -r

2019-12-09+16:51:05.2652388850 /home/admin/apache-cassandra-3.0.18/logs/gc.log.0.current

2019-12-09+16:51:04.9392455540 /home/admin/apache-cassandra-3.0.18/logs/debug.log

2019-12-09+16:51:04.9282457790 /home/admin/apache-cassandra-3.0.18/logs/system.log

IO和CPU同時優化:

$ nice -n ionice -c2 -n7 find /path/to/search -name "myfile.txt"

【202001】

80331d34d348a6d0f61f6f89d51da2ef.png

end

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443646.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

劍指offer之從上到下打印二叉樹

從上到下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序打印。 例如: 給定二叉樹: [3,9,20,null,null,15,7], 返回: [3,9,20,15,7] 來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problem…

小米真藍牙耳機說明書_小米真無線藍牙耳機Air2 SE評測:僅需169元,享受隨心暢聽體驗...

繼小米真無線藍牙耳機Air 2、小米真無線藍牙耳機Air 2S之后,小米公司又于2020年5月19日再次推出了一款售價更為親民的真無線藍牙耳機新品——小米真無線藍牙耳機Air2 SE,該機不僅延續了小米真無線藍牙耳機Air 2系列的外觀設計,支持開盒彈窗、…

引用與指針的區別

雖然指針和引用都可以完成對其他對象的間接訪問,但是還是有很多不同之處: 1.本身是否是對象 指針本身就是一個對象,而引用本身不是一個對象。因此允許對指針賦值和拷貝,可以定義對指針的引用,已經指向指針的指針&#…

三點外接圓_故地重游偽切圓——偽外接圓的基本性質

在思考一個有關于偽外接圓的等角線問題時,我回想起偽外接圓的一道小題目,這是2012年羅馬尼亞大師杯的第六題,這道題目直接以結論的形式呈現出了偽外接圓的基本性質,是一道入門偽外接圓必做的精巧小題。當然有些讀者可能從未見過&q…

C++的const限定符

const限定符總是讓人很頭疼,下面講解一下幾個比較容易混淆的概念: 對常量的引用(常量引用): 一般情況下,引用的類型要與其所引用的對象的類型一致,其中的例外情況就是,當初始化常量…

Linux學習:第五章-Linux用戶和用戶組管理

一用戶管理命令用戶信息文件:/etc/passwd aa:x:501:501::/home/aa:/bin/bash 第一列:用戶名 第二列:密碼標志 第三列:UID用戶ID 0管理員 1-499系統用戶(偽用戶) 500普通用戶 第四列:GID初始組ID…

一點等于多少厘米_馬桶知識介紹,你了解馬桶多少

我們可能并不了解我們經常運用的馬桶,認為馬桶便是簡簡單單的規劃,沒什么技術含量。其實不然,馬桶的規劃也包含了不少物理學原理。假如你家里的馬桶出現毛病,首先要排查毛病的原因,但是假如不了解馬桶結構圖那就很難把…

動態內存分配與智能指針

內存分配: 靜態存儲區: 局部static對象類的static數據成員定義在任何函數之外的變量 棧區: 函數內的非static對象 動態內存分配的方式有: new和delete智能指針(shared_ptr、unique_ptr、weak_ptr)all…

1151壓力變送器型號_日本進口橫河EJA530E壓力變送器型號解讀!

橫河EJA變送器對大家來說也許不陌生,但是對于EJA變送器的型號很多人還不是很懂,因為一個全型號代表這很多參數,每一個字母和每一個數字背后都是一個準確的參數,我們在選型的時候要提供必要的參數,更具參數選出合適的型…

plc控制可調節閥流程圖_PLC控制的水箱液位控制系統畢業論文

內容介紹原文檔由會員 莎士比亞 發布論文標準WORD格式排版40頁摘要在人們生活以及工業生產等諸多領域經常涉及到液位和流量的控制問題, 例如居民生活用水的供應, 飲料、食品加工, 溶液過濾, 化工生產等多種行業的生產加工過程, 通常需要使用蓄液池, 蓄液池中的液位需要維持合適…

idea繼承后重新方法快捷鍵_idea 查看類繼承關系的快捷鍵

類似eclipse ctrlt的快捷鍵,idea中是ctrlH…找到對應的類 查看類關系圖…1.在想要查看的類上按 Ctrl H -> Diagrams -> Show Diagrams -> Java Class Diagrams -> Show Implementations -> Ctrl A -> 右擊一下 -> Enter .…打開想要查看的接口或者類文件…

怎樣在數組末尾添加數據_如何利用C++實現可變長的數組?

應該執行什么功能?假設我們要實現一個將自動擴展的數組類,是否需要實現函數?讓我們從下面主要功能使用的功能開始,看看我們需要實現哪些功能。輸出結果:0 1 2 3 40 1 2 100 4您需要做什么才能實現上述功能?…

Linux學習:第六章-Linux服務和進程管理

一進程查看 1psaux查看當前系統所有運行的進程 -a顯示前臺所有進程 -u顯示用戶名 -x顯示后臺進程 user: 用戶名 pid:進程id。PID1init系統啟動的第一個進程 %CPUcpu占用百分比 %MEM內存占用百分比 VSZ虛擬內存占用量KB RSS固定內存占有量 tty登錄終端tty…

覆蓋索引與聯合索引_淺析MySQL的索引覆蓋和索引下推

寫在前面在MySQL數據庫中,索引對查詢的速度有著至關重要的影響,理解索引也是進行數據庫性能調優的起點,索引就是為了提高數據查詢的效率。今天我們來聊聊在MySQL索引優化中兩種常見的方式,索引覆蓋和索引下推索引覆蓋要了解索引覆…

python3 輸入輸出_Python3基礎之輸入和輸出實例分析

通常來說,一個Python程序可以從鍵盤讀取輸入,也可以從文件讀取輸入;而程序的結果可以輸出到屏幕上,也可以保存到文件中便于以后使用。本文就來介紹Python中最基本的I/O函數。一、控制臺I/O1.讀取鍵盤輸入內置函數input([prompt])&…

redis 哨兵 異步_突破Java面試(23-8) - Redis哨兵主備切換的數據丟失問題-阿里云開發者社區...

1 數據丟失的兩個場景主備切換的過程,可能會導致數據丟失1.1 異步復制由于 master > slave的復制是異步的,所以可能有部分數據還沒復制到slave,master就宕機,于是這些數據就丟失了1.2 腦裂導致腦裂,也就是說&#x…

vue 斷開正在發送的請求_vue 發送請求頻繁時取消上一次請求

前言:在項目中經常有一些場景會連續發送多個請求,而異步會導致最后得到展示的結果可能不是最后一次發送請求返回的結果,且對性能也有非常大的影響。場景:列表式切換商品,有時候上一次請求的結果非常慢,而我…

Linux學習:第六章-Linux網絡配置

上一章的補充: 常見網絡端口: 2021ftp服務文件共享 22ssh服務安全遠程網絡管理 23telnet服務 25smtp:簡單郵件傳輸協議發信 110pop3:郵局協議收信 80www網頁服務 3306mysql端口 3389windows終端服務 53DNS端口 /etc/services所有系…

sequelize 增加數據庫字段_Node項目使用Sequelize操作數據庫(一)(包括模型,增,刪、改等)...

Sequelize 是一個基于 Promise 的 Node.js ORM,目前支持 Postgres、MySQL、SQLite 和 Microsoft SQL Server。它具有強大的事務支持,關聯關系、讀取和復制等功能。所謂ORM是指對象關系映射,通過使用描述對象和數據庫之間映射的元數據&#xf…

django orm插入一條_如何通過django的ORM遠程發布文章?

利用django的ORM可以方便的給數據庫插入文章但是假如我django放在阿里云,那我想在本地寫個插件,每天很方便的插入一些數據,最好是通過ORM的,因為管理起來比較方便,會涉及到多個站,可能會有200多個站&#x…