1. 文件查找:

 

  在linux系統中由於文件的眾多,往往需要在眾多的文件當中查找某一個文件,如果時間一長,很難記得文件存放至何處,不過,這一點,你不比擔心,因為開發人員為我們提供了強大的文件搜索工具,下面將介紹兩款常用的文件查找工具locate,和find,這兩款查找工具只能是從文件系統中查找不能在內存當中查找,因為內存是沒有文件系統的。

 

2. locate命令:

 

  locate命令是基於數據庫來查找文件的,命令查找速度快,一般查找跟新慢的,名字變化少的,如:配置文件,可以用locate查找,因為數據庫需要更新,所以就會有一點延遲,locate命令一般是每天更新一次數據庫,所以有可能最新創建的文件找不到,或者剛剛刪除的文件任在數據庫當中。可以使用updatedb更新數據庫信息,數據庫文件:/var/lib/mlocate/mlocate.db

 locate 用法:

  locate 選項 參數

選項:

-e 排除在尋找范圍之外。

-q 安靜模式,不顯示任何錯誤信息

-n 最多顯示#個輸出

-r 支持正則表達式

-i 忽略大小寫

-b 基名

示例:

[root@cnode6_8 etc]# locate -r'\<functions$' -n 3 /etc/rc.d/init.d/functions /etc/sysconfig/network-scripts/network-functions /lib/lsb/init-functions
 

 

3. find命令:

 

  用來在指定目錄下查找文件。功能十分強大,可以根據各種條件進行查找,如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。

語法:

  find 選項 查找路徑 查找條件 處理動作

選項:

根據文件名和iNode查找:

-name 支持使用通配符* ? [] [^] 根據文件名查找

-iname 不區分大小寫的根據文件名查找

-inum # 根據#指定的iNode號查找

-samefile 相同iNode號相同的文件,也就是硬鏈接

-link # 鏈接數為#的文件

-regex 使用正則表達式匹配文件

根據文件屬組和屬主查找:

-user 根據屬組為指定用戶UID查找文件

-grop 查找屬組問指定組的文件

-gid根據gid號碼查找文件

-nouser查找沒有屬主的文件

-nogrop查找沒有屬組的文件

根據文件類型:

-type

f 普通文件

d 目錄文件

l 符號鏈接文件

s 套接字文件

b 塊設備文件

c 字符設備文件

p 管道文件

組合條件:

 

-a 與

-o 或

-not !非

根據文件大小查找:可以查找指定范圍大小(帶單位k,M,G)的文件

-size [+|-]#unit

# unit (#-1,#] 區間前開后閉

-#unit [0.#-1]

+#unit (#,∞)

根據時間戳查找:可以以天或分鍾為單位

[+|-]#參數意義:#:[#,#+1],+#:[#+1, ∞], -# [0,#)

-atime 訪問時間

-mtime 修改時間

-ctime 改變時間

以分鍾為單位的三種時間

-amin

-mmin

-cmin

根據權限查找:-perm [/-] mode

 

mode 精確權限匹配

/mode 每一位只要有一類匹配的就行

-mode 每一類必須同時擁有mode指定的權限

0 表示不關注,權限隨意

查找完成的處理動作:

-ls 類似於ls –l 命令可以顯示文件詳細列表

-delete 刪除查找到的文件

-fls 查找到的文件都以長格式形式保存在文件當中

-ok command {} \;對查找到的文件執行command之前都會交互式的詢問用戶

-exec command {} \;類似於上一個命令,不需要交互,直接默認執行

排除查找的目錄:

-prune(修減)不包含的文件或目錄

補充:

關於時間大小方面參數數字的意義和示例:如查找文件大小為12k,表示查找的文件是大於等於11k,小於12k,是指定的值減1得到的,+6k表示查找文件7k(大於6k)到正無窮

-6k表示0到5k(包含5k,小於6k)的文件

 

4. find查找文件實例:

 

1、查找/var目錄下屬主為root,且屬組為mail的所有文件

[root@centos7 ~]# find /var/ -user root-group mail -ls 201334650 0 drwxrwxr-x 2 root mail 50 Aug 13 12:54/var/spool/mail 205749525 0 -rw------- 1 root mail 0 Aug 13 12:54 /var/spool/mail/root
 

 

2、查找/var目錄下不屬於root、lp、gdm的所有文件

[root@centos7 ~]# find /var/ -not \( -user root -o -user lp -o -user gdm\)
 

 

3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件

[root@centos7 ~]# find /var/ -mtime -7 -not\( -user root -o -user postfix \)
 

 

4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件

[root@centos7 ~]# find / -nouser -nogroup-atime -7
 

 

5、查找/etc目錄下大於1M且類型為普通文件的所有文件

[root@centos7 ~]# find /etc/ -size +1M-type -f find: Arguments to -type should containonly one letter [root@centos7 ~]# find /etc/ -size +1M-type f /etc/selinux/targeted/policy/policy.29 /etc/udev/hwdb.bin /etc/brltty/zh-tw.ctb
 

 

6、查找/etc目錄下所有用戶都沒有寫權限的文件

[root@centos7 ~]# find /etc/ -not -perm/222 –ls
 

 

7、查找/etc目錄下至少有一類用戶沒有執行權限的文件

[root@centos7 ~]# find /etc/ -perm -111 -ls
 

 

8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件

[root@centos7~]# find /etc/init.d/ -perm -113 /etc/init.d/test
 

9. 實際生產環境可能使用到的案例:

如果需要對某一個目錄批量設置權限,但是文件和目錄的權限不一致時可以用find命令分別設定 

這里給出一個循環遞歸得到對文件夾和文件分別有效的設置方法: 

[root@centos7~]#find /path -type f -exec chmod 644 {} \; #對目錄和子目錄里的文件
 
[root@centos7~]#find /path -type d -exec chmod 755 {} \; #對目錄和子目錄path 是路徑 type 類型 d 是目錄 f是 文件 exec 執
 



附:德·摩根定律

非(P 且Q) = (非P) 或(非Q)

非(P 或Q) = (非P) 且(非Q)