linux下find(文件查找)命令的詳解

文件查找命令locate和find詳解

locate 配合數據庫緩存,快速查看文件位置,非實時查找( 數據庫查找) 
find 實際搜尋硬盤查詢文件名稱 ,實時查找

locate簡介

locate命令其實是find -name的另一種寫法,但是要比后者快得多,原因在于它不搜索具體目錄,而是搜索一個數據庫/var/lib/locatedb,這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,并且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。

locate 命令

locate KEYWORD 
有用的選項 
-i 執行區分大小寫的搜索 
-n N 只列舉前N 個匹配項目 
實例:

手動更新數據庫

[root@localhost ~]# updatedb

搜索etc目錄下所有以sh開頭的文件:

[root@localhost ~]# locate /etc/sh 

搜索用戶主目錄下,所有以m開頭的文件:

[root@localhost ~]# locate ~/m 

搜索用戶主目錄下,所有以m開頭的文件,并且忽略大小寫:

[root@localhost ~]# locate -i ~/m

使用Regex 來搜索以“.foo ”結尾的文件

[root@localhost ~]# locate -r ‘\.foo$’

find簡介

find命令用來在指定目錄下查找文件。任何位于參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進行顯示。


find [OPTION]… [ 查找路徑] [ 查找條件] [ 處理動作] 
查找路徑:指定具體目標路徑;默認為當前目錄 
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件 
處理動作:對符合條件的文件做操作,默認輸出至屏幕

[查找路徑]

不輸入代表當前目錄 
例:

find
find  /boot

查找條件

根據文件名和inode 查找

-name” 文件名稱”:支持使用glob*, ?, [], [^] 
-iname” 文件名稱”:不區分字母大小寫 
-inum n 按inode 號查找 
-samefile name 相同inode 號的文件 
-links n 鏈接數為n 的文件 
-regex "PATTERN":以PATTERN 匹配整個文件路徑字符串,而不僅僅是文件名稱

[root@localhost ~]# useradd user1
[root@localhost ~]# useradd vipuser3
[root@localhost ~]# touch /home/user1/aaausercccc
[root@localhost ~]# find /home/  -name *user*

根據屬主、屬組查找 
-user USERNAME :查找屬主為指定用戶(UID) 的文件 
-group GRPNAME: 查找屬組為指定組(GID) 的文件 
-uid UserID :查找屬主為指定的UID 號的文件 
-gid GroupID :查找屬組為指定的GID 號的文件 
-nouser :查找沒有屬主的文件 
-nogroup:查找沒有屬組的文件 
例:查找home目錄下的死神的文件

[root@localhost ~]# find /home -user zhanghe

查找條件

根據文件類型查找: 
-type TYPE: 
f: 普通文件 
d: 目錄文件 
l: 符號鏈接文件 
s :套接字文件 
b: 塊設備文件 
c: 字符設備文件 
p: 管道文件 
實例: 
分別查看home下得文件和目錄

[root@localhost ~]# find /home/ -type d
[root@localhost ~]# find /home/ -type f

組合條件:

與:-a 
或:-o 
非:-not,! 
實例:

在/root找其他人可以寫的文件

[root@localhost ~]# find -type f -a -perm  -002
[root@localhost ~]# find -type f  -and -perm /o+w
./b.sh

其他人可以執行的非普通文件的文件

[root@localhost ~]# find ! -type f  -and -perm -001

根據文件大小來查找

-size [+|-]#UNIT 
文件大小單元: 
b —— 塊(512字節) 
c —— 字節 w —— 字(2字節) 
k —— 千字節 
M —— 兆字節 
G —— 吉字節

搜索大于10KB的文件

find . -type f -size +10k 

搜索小于10KB的文件

find . -type f -size -10k 

搜索等于10KB的文件

find . -type f -size 10k

基于目錄深度搜索

向下最大深度限制為3

find . -maxdepth 3 -type f 

搜索出深度距離當前目錄至少2個子目錄的所有文件

find . -mindepth 2 -type f

根據時間戳:

find . -type f 時間戳

Linux文件系統每個文件都有三種時間戳: 
訪問時間(-atime/天,-amin/分鐘):用戶最近一次訪問時間。 
修改時間(-mtime/天,-mmin/分鐘):文件最后一次修改時間。 
變化時間(-ctime/天,-cmin/分鐘):文件數據元(例如權限等)最后一次修改時間。

搜索最近七天內被訪問過的所有文件

find . -type f -atime -7 

搜索恰好在七天前被訪問過的所有文件

find . -type f -atime 7 

搜索超過七天內被訪問過的所有文件

find . -type f -atime +7 

搜索訪問時間超過10分鐘的所有文件

find . -type f -amin +10 

找出比file.log修改時間更長的所有文件

find . -type f -newer file.log

根據權限查找

find -perm 755 會匹配權限模式恰好是755 的文件 
只要當任意人有寫權限時,find -perm +222 就會匹配 
只有當每個人都有寫權限時,find -perm -222 才會匹配 
只有當其它人(other )有寫權限時,find -perm -002才會匹配

當前目錄下搜索出權限為777的文件

find . -type f -perm 777 

找出當前目錄下權限不是644的php文件

find . -type f -name "*.php" ! -perm 644 

找出當前目錄用戶tom擁有的所有文件

find . -type f -user tom 

找出當前目錄用戶組sunk擁有的所有文件

find . -type f -group sunk

處理動作

-print :默認的處理動作,顯示至屏幕; 
-ls :類似于對查找到的文件執行“ls -l” 命令 
-delete :刪除查找到的文件; 
-fls file :查找到的所有文件的長格式信息保存至指定文件中 
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND 指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認 
-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND 指定的命令 
{}: 用于引用查找到的文件名稱自身

find 傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令 
有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題 
find | xargs COMMAND 
備份配置文件,添加.orig 這個擴展名

find -name “*.conf-exec cp {} {}.org \;

提示刪除存在時間超過3天以上的joe 的臨時文件

find /tmp -ctime +3 -user joe -ok rm {} \;

在你的主目錄中尋找可被其它用戶寫入的文件

find ~ -perm -002 -exec chmod o-w {} \;

在data目錄里面查找文件是644權限的.sh結尾 然后修改權限為755

find /datatype f -perm 644 -name “*.sh” –exec chmod 755 {} \;

查找home下的目錄并列出

find /home –type d -ls
借助-exec選項與其他命令結合使用

找出當前目錄下所有root的文件,并把所有權更改為用戶tom

find .-type f -user root -exec chown tom {} \; 

上例中,{} 用于與-exec選項結合使用來匹配所有文件,然后會被替換為相應的文件名。 找出自己家目錄下所有的.txt文件并刪除

find $HOME/. -name "*.txt" -ok rm {} \; 

上例中,-ok和-exec行為一樣,不過它會給出提示,是否執行相應的操作。 查找當前目錄下所有.txt文件并把他們拼接起來寫入到all.txt文件中

find . -type f -name "*.txt" -exec cat {} \;> all.txt 

將30天前的.log文件移動到old目錄中

find . -type f -mtime +30 -name "*.log" -exec cp {} old \; 

找出當前目錄下所有.txt文件并以“File:文件名”的形式打印出來

find . -type f -name "*.txt" -exec printf "File: %s\n" {} \; 

因為單行命令中-exec參數中無法使用多個命令,以下方法可以實現在-exec之后接受多條命令

-exec ./text.sh {} \;

搜索但跳出指定的目錄 查找當前目錄或者子目錄下所有.txt文件,但是跳過子目錄sk

find . -path "./sk" -prune -o -name "*.txt" -print

原創文章,作者:M20_he,如若轉載,請注明出處:http://www.www58058.com/36508

(2)
M20_heM20_he
上一篇 2016-08-18 10:10
下一篇 2016-08-18 13:36

相關推薦

  • 認識shell

    一、認識shell 什么是shell?shell為單詞外殼的意思。那么這是誰的外殼?我們知道一個系統中實際工作的是那些硬件,cpu、內存、磁盤等。我們如何調用這些硬件為我們工作?實際上,硬件是由內核kernel控制的。我們可以通過kernel控制硬件,但我們不能直接和內核kernel交流。我們需要一個外殼,這個外殼就是shell來溝通kernel。何為she…

    Linux干貨 2015-09-22
  • linux 故障—-/boot刪除 修復

    LINUX        /BOOT        SHANCHU 光盤進入resuce  第①步;修復內核文件 shell start shell 首先先切根 chroot &n…

    Linux干貨 2016-09-13
  • linux之netfilter與 iptables學習

    Linux之netfilter與iptables學習 一、為什么我們的主機需要防火墻 二、Linux下防火墻如何實現 三、四表五鏈學習 四、主機防火墻 五、網絡防火墻 六、iptables命令學習 七、主機防火墻規則備份與恢復 ====================================== 一、為什么我們的主機需要防火墻?  &nbs…

    Linux干貨 2016-06-23
  • 震驚??!iptables還能這樣用!

    基本語法:iptables [-t 表] [操作命令] [鏈][規則匹配器][-j 目標動作] 系統的INPUT和OUTPUT默認策略為DROP; # iptables -P INPUT DROP # iptables -P OUTPUT DROP 1、限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin…

    系統運維 2017-04-18
  • Linux之查找命令find簡介

    查找命令find簡介    Linux使用過程中難免會遇到查找功能,類似于Windows中的搜索功能,如果想要找某個文件在什么地方,什么格式的文件等等。在Linux中我們可以使用find、locate、which、whereis等命令。接下來我們就簡單說一下如何使用這幾個命令查找文件。 一、which which命令的作用是,在PATH變…

    Linux干貨 2015-05-18

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-19 15:21

    文章對find的常見選項用了具體的操作和練習,課堂作業需要附加在后面,這也是需要用心完成的哦。

欧美性久久久久