【文本處理命令】之find搜索命令

1、find搜索命令

  find命令用於按照指定條件查找文件。在系統工做中find命令是不可缺乏的,咱們通常要查找某個目錄下的文件時,都是使用find命令查找,另外find命令也能夠配合對查找出的文件進行刪除或其餘操做。他能夠使用不一樣的文件特性做爲查找的條件(文件名,大小,修改時間,權限等信息),匹配成功默認將信息顯示在屏幕上。shell

格式:

find [查找路徑] 查找條件 操做

經常使用參數:

-name name, -iname name : 文件名稱符合 name 的文件。iname 會忽略大小寫 -perm    匹配權限(mode徹底匹配,-mode爲包含便可)
  
-perm 444 #查找文件權限
  -perm -444 # -表示而且;查找文件權限中u位有r權限,而且g位有r權限,而且o位有r權限的文件
  -perm /444 # /表示或者;查找文件權限中u位有r權限,或者g位有r權限,或者o位有r權限的文件
  -perm /777 # 777=rwx rwx rwx 即9個條件中知足任意一個便可
-user 匹配全部者 -nouser 匹配無全部者的文件 -group 匹配全部組 -nogroup 匹配無全部組的文件 -mtime -n,+n        匹配修改內容的時間(-n指n天之內,+n指n天之前) -atime -n,+n        匹配訪問文件的時間(-n指n天之內,+n指n天之前) -ctime -n,+n        匹配修改文件權限時間(-n指n天之內,+n指n天之前) -amin n : 在過去 n 分鐘內被讀取過 -cmin n : 在過去 n 分鐘內被修改過 -size n : 匹配文件的大小(50KB查找50KB的文件,+50KB位查找超過50KB的文件,-50KB是查找小於50KB的文件)。文件大小 是 n 單位,b 表明 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組。 --type c 指定類型,文件類型是 c 的文件。
 d: 目錄文件 c: 字符設備 b: 設備文件 p: 管道 f: 通常文件 l: 符號連接文件
-maxdepth : 查找最大深度,即目錄層次
-mindepth : 查找最小深度
-newer f1 !f2 匹配比f1新但比f2舊的文件 -prune 忽略某個目錄 -exec command {} \; 後接執行的命令 -ok command {} \; 後接執行命令,執行以前會進行詢問是否執行該命令
-a  且(要同時知足)
-o  或(只需知足其中一個條件便可)

實例:centos

1)查找當前目錄下最近20天以內更新的文件bash

# find . -ctime -20

2)查找/var/log目錄中更改時間在7日之前的普通文件,並在刪除以前詢問ui

# find /var/log -type f -mtime +7 -ok rm {} \;

3)查找前目錄中文件屬主具備讀、寫權限,而且文件所屬組的用戶和其餘用戶具備讀權限的文件(只匹配644)spa

# find . -type f -perm 644 -exec ls -l {} \;

4)模糊匹配644權限(包含644便可)3d

# find . -type f -perm -644 -exec ls -l {} \;

5)查找系統中全部文件長度爲0的普通文件,並列出它們的完整路徑code

# find . -type f -size 0 -exec ls -l {} \;

6)-exec執行命令blog

# 刪除沒有屬主的用戶 # find / -nouser -exec rm -rf {} \; 

# 刪除查找的文件 # find /home -name "*log" | xargs rm -rf {} \;

7)-a和-o參數使用it

# 找到全部權限是644的普通文件 # find /usr/local/ -perm 644 -a -type f | head

# 找到以a開頭或以a結尾的普通文件 # find . -name "a*" -o -name "*a" -type f

 PS:使用-a的話則須要同時知足class

8)查詢屬主、屬組

# 查詢屬主爲root的文件 # find /etc/ -user root -type f | head -n 3 | xargs ls -l;

# 查詢屬組爲root的文件 # find /etc/ -group root -type f | head -n 3 | xargs ls -l;

# 查詢沒有屬主、屬組的文件 # find /etc/ -nouser -type f | head -n 3 | xargs ls -l; # find /etc/ -nogroup | head -n 3 | xargs ls -l;

9)在整個文件系統中找出歸屬於thy用戶的文件復到指定目錄

# 模擬一個用戶,將備份的passwd文件的屬主和屬組改成thy # useradd thy # chown thy.thy /tmp/passwd  # ll /tmp/passwd 
-rw-r--r-- 1 thy thy 1708 Nov  4 09:56 /tmp/passwd # 使用find命令將屬主爲thy的文件複製到指定目錄 # find / -user thy -type f -exec cp -a {} /tmp/thy/ \;

10)綜合案例:按文件全部者和全部組查找 

# 建立文件
[root@localhost ~]# cd /tmp/test
[root@localhost test]# touch file{1..5}
[root@localhost test]# ls
file1 file2 file3 file4 file5 # 實時監聽這個目錄(能夠另外開一個shell窗口)
[root@VM_0_10_centos ~]# watch -n 1 ls -l /tmp/test/

# 添加用戶
[root@VM_0_10_centos test]# useradd teacher
[root@VM_0_10_centos test]# useradd student
[root@VM_0_10_centos test]# id teacher
uid=1008(teacher) gid=1011(teacher) groups=1011(teacher) [root@VM_0_10_centos test]# id student
uid=1009(student) gid=1012(student) groups=1012(student) # 修改用戶主和屬組
[root@VM_0_10_centos test]# chown teacher.teacher /tmp/test/file1 # chown和chgrp修改屬組效果是同樣的
[root@VM_0_10_centos test]# chown .teacher /tmp/test/file2 
[root@VM_0_10_centos test]# chgrp student /tmp/test/file2 
[root@VM_0_10_centos test]# chown teacher.student /tmp/test/file3

# 按文件全部者查找
[root@VM_0_10_centos test]# find / -user teacher -type f
/home/teacher/.bashrc /home/teacher/.bash_logout /home/teacher/.bash_profile /var/spool/mail/teacher /tmp/test/file3 /tmp/test/file1 # 按文件全部組查找
[root@VM_0_10_centos test]# find / -group teacher -xtype f
/home/teacher/.bashrc /home/teacher/.bash_logout /home/teacher/.bash_profile /tmp/test/file1 [root@VM_0_10_centos test]# find / -group student -type f
/home/student/.bashrc /home/student/.bash_logout /home/student/.bash_profile /tmp/test/file2 /tmp/test/file3 # 查找全部者爲root,所屬組爲student的文件(默認表示且關係)
[root@VM_0_10_centos test]# find / -user root -group student -type f
/tmp/test/file2 等價於 [root@VM_0_10_centos test]# find / -user root -a -group student -type f
/tmp/test/file2 # 查找全部者爲teacher或所屬組爲student的文件(表示或關係)
[root@VM_0_10_centos test]# find / -user teacher -o -group student -type f
/home/student/.bashrc /home/student/.bash_logout /home/student/.bash_profile /home/teacher /home/teacher/.bashrc /home/teacher/.bash_logout /home/teacher/.bash_profile /var/spool/mail/teacher /tmp/test/file2 /tmp/test/file3 /tmp/test/file1 # 查找所屬者不是student的用戶
[root@VM_0_10_centos test]# find /tmp/ -not -user root -type f -exec ls -l {} \;
-rw-r--r-- 1 thy thy 1708 Nov  4 09:56 /tmp/passwd -rw-r--r-- 1 teacher student 0 Nov  5 11:16 /tmp/test/file3 -rw-r--r-- 1 teacher teacher 0 Nov  5 11:16 /tmp/test/file1

 11)按文件所在深度(層次)查找

# 最大深度
[root@VM_0_10_centos test]# find /etc/ -maxdepth 2 | head -n 5
/etc/
/etc/group /etc/rc6.d /etc/audit /etc/audit/audit.rules # 最小深度
[root@VM_0_10_centos test]# find /etc/ -maxdepth 1 | head -n 5
/etc/
/etc/group /etc/rc6.d /etc/audit /etc/mailcap # 查找/etc目錄下最少層次爲1最多層次爲2的以.conf結尾的文件(這裏將最大和最小深度的位置對換就會查不出結果)
[root@VM_0_10_centos test]# find /etc/ -mindepth 1 -maxdepth 2 -name *.conf | head -n 3
/etc/audit/auditd.conf /etc/sysctl.conf /etc/depmod.d/kvdo.conf

12)對查找到的文件執行某些動做

# 對查詢到的文件進行分權限操做
[root@VM_0_10_centos test]# find /tmp/test/ -perm 644 -exec chmod g+w {} \;
[root@VM_0_10_centos test]# ll
total 0
-rw-rw-r-- 1 teacher teacher 0 Nov  5 11:16 file1 -rw-rw-r-- 1 root    student 0 Nov  5 11:16 file2 # 對查詢的文件進行備份
[root@VM_0_10_centos test]# find /tmp/test/ -type f -exec cp {} /tmp/test/test/ \;
cp: ‘/tmp/test/test/file2’ and ‘/tmp/test/test/file2’ are the same file cp: ‘/tmp/test/test/file3’ and ‘/tmp/test/test/file3’ are the same file cp: ‘/tmp/test/test/file5’ and ‘/tmp/test/test/file5’ are the same file
相關文章
相關標籤/搜索