zoukankan      html  css  js  c++  java
  • find

    一、简介

    1.find默认操作是打印出文件和目录,但是最好使用-print选项来指定

    2.find若要传给xagrs命令,则应使用-print0选项来指定,此时分隔符由 变为

    3.find  路径  选项+参数

    二、技巧

    1.利用正则表达搜索

    [root@localhost 1]# ll
    total 0
    -rw-r--r-- 1 root root 0 Apr  6 19:30 file1.txt
    -rw-r--r-- 1 root root 0 Apr  6 19:31 FILE1.txt
    -rw-r--r-- 1 root root 0 Apr  6 19:30 file2.txt
    -rw-r--r-- 1 root root 0 Apr  6 19:31 FILE2.txt
    [root@localhost
    1]# find -name "*1*" -print ./file1.txt ./FILE1.txt
    [root@localhost
    1]# find -iname '*2*' -print ./file2.txt ./FILE2.txt

    说明:

      (1)-name  文件名

      (2)-iname  忽略字母大小写

      (3)Shell会扩展没有引号或双引号" "中的通配符,单引号‘ ’能阻止Shell扩展,使字符串原封不动地传给find命令。

    2.否定参数

    [root@localhost 1]# ll
    total 0
    -rw-r--r-- 1 root root 0 Apr  6 19:30 file1.txt
    -rw-r--r-- 1 root root 0 Apr  6 19:31 File1.txt
    -rw-r--r-- 1 root root 0 Apr  6 19:30 file2.txt
    -rw-r--r-- 1 root root 0 Apr  6 19:31 FILE2.txt
    [root@localhost
    1]# find -iname '*2.txt' ./file2.txt ./FILE2.txt
    [root@localhost
    1]# find ! -iname '*2.txt' . ./file1.txt ./File1.txt

    说明

      (1)find采用排除法时可用!。一条语句可以使用多个!,只要!在该选项前面即可。

    3.基于目录深度搜索

    [root@localhost 1]# find -L /proc/ -maxdepth 1 -name 'bundleamaker.def' 2> /dev/null 
    [root@localhost 1]# ll
    total 0
    lrwxrwxrwx 1 root root 1 Apr  6 19:57 1 -> 3
    lrwxrwxrwx 1 root root 1 Apr  6 19:56 2 -> 1
    lrwxrwxrwx 1 root root 1 Apr  6 19:57 3 -> 2

    [root@localhost 1]# find -L . -name "1" find: ‘./2’: Too many levels of symbolic links find: ‘./3’: Too many levels of symbolic links find: ‘./1’: Too many levels of symbolic links

    说明:

      (1)-L  跟随符号链接。注意:若碰上了指向自身的链接,find就会陷入死循环中。

      (2)-maxdepth  最大目录深度。本例,搜索范围限制在当前目录。

      (3)-mindepth   最小目录深度。用于查找较深的文件。

      (4)maxdepth和mindepth选项要靠前,从而保证效率。

    4.根据文件类型搜索

    [root@localhost 1]# find . -type f -print
    [root@localhost 1]# find . -type d -print
    [root@localhost 1]# find . -type l -print

    说明:

      (1)-f   文件

      (2)-d  目录

      (3)-l   符号链接

      (4)-b  块设备

      (5)-p  FIFO

      (6)-c  字符设备

      (7)-s  套接字

    5.根据文件时间戳搜索

    [root@localhost 1]# find . -type f -atime -1 -print    #打印最近1天内被访问过的文件
    [root@localhost 1]# find . -type f -atime  1 -print  #打印恰好在1天前被访问的文件
    [root@localhost 1]# find . -type f -atime +1 -print  #打印访问时间超过1天的文件

    说明:

      (1)-atime:The data was referenced but unchanged.【使用ls -lu查看文件的atime】

      (2)-mtime:The data inside was amended or deleted or added.【使用ls -l查看文件的mtime】

      (3)-ctime:The medata was changed, such as permission or owner was changed.【使用ls -lc查看文件的ctime】

      (4)均以“天”为单位,也可以使用amin/mmin/cmin以“分钟”为单位。

      (5)-表示小于、+表示大于,不带符号表示恰好这一天。

    [root@localhost 1]# ll
    total 12
    -rw-r--r-- 1 root root 3 Apr  6 21:59 1
    -rw-r--r-- 1 root root 2 Apr  6 21:59 2
    -rw-r--r-- 1 root root 2 Apr  6 21:59 3

    [root@localhost 1]# find . -type f -newer 1 -print ./2 ./3

    说明: 

      (5)-newer  指定一个用于比较mtime的参考文件,然后找出比它更新mtime的文件。

    6.基于文件大小搜索

    [root@localhost 1]# find . -type f -size -1k  #文件小于1k
    [root@localhost 1]# find . -type f -size  1k  #文件等于1k
    [root@localhost 1]# find . -type f -size +1k  #文件大于1k

    说明:

      (1)k   1024字节

      (2)M  1024k字节

      (3)G  1024M字节

      (4)c   1字节

      (5)w  2字节=1个字

      (6)b  512字节=1个块

    7.基于文件权限和所有权搜索

    [root@localhost 1]# find . -type f -perm 755 -print
    
    [root@localhost 1]# find . -type f -user root -print

    说明:

      (1)-perm  文件权限

      (2)user    文件所有者。当然也可以用UID

    8.删除和执行其他操作

     
    [root@localhost 1]# find . -type f -name "*.txt" -delete
    
    [root@localhost 1]# find . -type f -user root -exec chown othe {} ;
    [root@localhost 1]# ll
    total 12
    -rwxr-xr-x 1 othe root 3 Apr  6 21:59 1
    -rw-r--r-- 1 othe root 2 Apr  6 21:59 2
    -rw-r--r-- 1 othe root 2 Apr  6 21:59 3
    
    [root@localhost 1]# find . -type f -group root -exec chgrp othe {} ;
    [root@localhost 1]# ll
    total 12
    -rwxr-xr-x 1 othe othe 3 Apr  6 21:59 1
    -rw-r--r-- 1 othe othe 2 Apr  6 21:59 2
    -rw-r--r-- 1 othe othe 2 Apr  6 21:59 3
    
    [root@localhost 1]# find . -type f -group root -exec chgrp othe {} +

    说明;

      (1)-delete  删除

      (2)-exec  

          It is a builtin command of the Bash Shell. It allows u to execute a command, which compeletly replaces current process. The current process is destoryed and entirely replaced by your specified command.

          { } expands to the output "find"

          ; ends the command "exec", which escape the semicolon ;

          + also can ends the command "exec", which -exec can receive multiple parameters to get One-time execution(执行时间更短)

    [root@localhost 1]# time  find . -type f -group othe -exec chgrp root {} +
    
    real    0m0.027s
    user    0m0.006s
    sys    0m0.020s
    [root@localhost 1]# ll
    total 12
    -rwxr-xr-x 1 othe root 3 Apr  6 21:59 1
    -rw-r--r-- 1 othe root 2 Apr  6 21:59 2
    -rw-r--r-- 1 othe root 2 Apr  6 21:59 3
    [root@localhost 1]# time  find . -type f -group root -exec chgrp othe {} ;
    
    real    0m0.055s
    user    0m0.017s
    sys    0m0.031s
    [root@localhost 1]# ll
    total 12
    -rwxr-xr-x 1 othe othe 3 Apr  6 21:59 1
    -rw-r--r-- 1 othe othe 2 Apr  6 21:59 2
    -rw-r--r-- 1 othe othe 2 Apr  6 21:59 3

          + also can ends the command "exec", which -exec can receive multiple parameters to get One-time execution(执行时间更短)

    [root@localhost 1]# find . -type f -group root -exec ./command.sh  {} +

          exec只能接受单个命令,若要在find -exec 后使用多个命令,可以将它们写到一个shell脚本中

    [root@localhost 1]# find . -type f -name "*.txt" -exec printf "Text file: %s
    " {} +
    Text file: ./file1.txt
    Text file: ./file2.txt
    Text file: ./file3.txt

             exec搭配-print来生成输出信息,print的使用和C语言一样(%s表示字符串)

    [root@localhost 1]# find . -type f -name "*.txt" -exec cat {} > all_txt_file.txt +
    cat: ./all_txt_file.txt: input file is output file
    [root@localhost 1]# cat all_txt_file.txt 
    1
    2
    3

             find的全部输出只有一个数据流,因此此处可以不使用>>符号 

    9.跳过特定目录 

    [root@localhost 2]# find .  -type f -print
    ./.git/file5.txt
    ./.git/file6.txt
    ./directoey/file3.txt
    ./directoey/file4.txt
    ./file1.txt
    ./file2.txt
    [root@localhost
    2]# find . -name "*.git" -prune -o -type f -print ./directoey/file3.txt ./directoey/file4.txt ./file1.txt ./file2.txt

    说明:

      (1)-prune  修剪。If the file is a directory, do not descend into it. 该选项一定要放到前面去!

      (2)-o    或操作。本例中,.git目录不一定存在,所以使用关系。其实我也不是非常肯定.....

      (3)这条语句的意思是:跳过.git目录,打印.路径下的所有文件名

      (4)只针对目录,不针对文件跳过!

     
  • 相关阅读:
    检测后缀表达式的合法性
    对表达式进行空白符预处理
    字符串替换
    中缀表达式的计算
    Linux shell编程
    Linux常用shell
    [转载]shell脚本编写规范
    [转载]Linux文件类型
    Linux的进程
    Linux进入命令行模式
  • 原文地址:https://www.cnblogs.com/ytdyz/p/12650580.html
Copyright © 2011-2022 走看看