zoukankan      html  css  js  c++  java
  • 每日一个Linux 命令-Find

    find — Linux manual page

    find - 在目录层次结构中搜索文件

    find 路径 -命令参数 [输出形式]
    参数说明:
    路径:告诉find在哪儿去找你要的东西,
    命令参数:参数很多下面会说到
    输出形式:输出形式很多,-print,-printf,-print0,-exec,-ok,-ls反正很多自己看手册吧
    说一下exec,
    -exec find命令对匹配的文件执行该参数所给出的其他linux命令。相应命令的形式为' 命令 - and' {} ;,注意{ }和;之间的空格,;是结束符,也可以是+。
    -ok 和- exec的作用相同,只不过和会人交互而已,OK执行前会向你确认是不是要执行。
    -name 按照文件名查找文件。
    -perm 按照文件权限来查找文件。
    -prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了- depth选项,那么-prune选项将被find命令忽略。
    -user 按照文件属主来查找文件。
    -group 按照文件所属的组来查找文件。
    -mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime选项,但它们都和-mtime选项
    相似,所以我们在这里只介绍-mtime选项。
    -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
    -nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
    -newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
    -type 查找某一类型的文件,诸如:
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l - 符号链接文件。
    f - 普通文件。
    s - socket文件
    -size n[cwbkMG] : 文件大小 为 n 个由后缀决定的数据块。其中后缀为:
    b: 代表 512 位元组的区块(如果用户没有指定后缀,则默认为 b)
    c: 表示字节数
    k: 表示 kilo bytes (1024字节)
    w: 字 (2字节)
    M:兆字节(1048576字节)
    G: 千兆字节 (1073741824字节)
    -depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
    -delete (删除)
    -maxdepth 查找最大目录层数 如 1,即只查找一层目录
    -fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
    /etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
    -mount 在查找文件时不跨越文件系统mount点。
    -follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
    -cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
    -o 是或者的意思
    -a 是而且的意思
    -not 是相反的意思
    参数

    下面通过一些简单的例子来介绍下find的常规用法:

    将查找(并打印)系统上的每个文件。由于所有内容都是文件,因此您将获得大量输出以进行排序。这可能无法帮助您找到所需的内容。您可以更改path参数以缩小范围,但实际上并没有比使用ls命令有用。

    也许您想在主目录中找到所有JPEG文件。使用-name参数可以将结果限制为与给定模式匹配的文件。

    #find ~ -name '*jpg' 

    如果其中一些扩展名为大写怎么办?-iname类似于-name,但是不区分大小写。

    #find ~ -iname '*jpg' 

    有些图片可能具有.jpeg扩展名。幸运的是,我们可以将模式与以-o表示的“或”组合。

    # find ~ ( -iname 'jpeg' -o -iname 'jpg' )

    但是,如果您有一些以jpg结尾的目录怎么办?(为什么您不命名图片而是为目录bucketofjpg命名。)我们可以使用-type参数修改命令以仅查找文件。

    # find ~ ( -iname '*jpeg' -o -iname '*jpg' ) -type f 

    或者,也许您想找到那些名字奇怪的目录,以便以后可以重命名它们:

    # find ~ ( -iname '*jpeg' -o -iname '*jpg' ) -type d 

    您最近拍摄了很多照片,所以让我们将其范围缩小到上周已更改的文件。

    # find ~ ( -iname '*jpeg' -o -iname '*jpg' ) -type f -mtime -7 

    您可以根据文件状态更改时间(ctime),修改时间(mtime)或访问时间(atime)进行时间过滤。这些以天为单位,因此,如果要进行更细粒度的控制,则可以用分钟来表示(分别为cmin,mmin和amin)。除非确切知道您想要的时间,否则您可能会在数字前加上+(大于)或–(小于)。

    # find ./ -name "*" -type f -mtime +7 -delete  #当前下面7天前所以的文件并删除
    
    # find . -mtime -2 -type f -print  #查找2天内被更改过的文件  
    
    # find . -mtime +2 -type f -print   #查找2天前被更改过的文件 
    
    # find . -atime -1 -type f -print  #查找一天内被访问的文件 
    
    # find . -atime +1 -type f -print  #查找一天前被访问的文件 
     
    # find . -ctime -1 -type f -print   #查找一天内状态被改变的文件
    
    # find . -ctime +1 -type f -print   #查找一天前状态被改变的文件
    
    # find . -cmin +10 -type f -print #  查找10分钟以前状态被改变的文件 
    限定日期查找文件
    # 寻找 当前目录 修改时间在 2020-01-24 的文件
    
    # find . -type f -newermt 2020-01-24 ! -newermt 2020-01-25 
    
    # 寻找 当前目录 修改时间在 2020-01-24 08:00 ~ 2020-01-25 08:00 的文件
    
    # find . -type f -newermt "2020-01-24 08:00" ! -newermt "2020-01-25 08:00"
     

    但是也许您不在乎您的照片。也许磁盘空间用完了,所以您想在日志目录中找到所有巨大的文件(让我们将其定义为“大于1 GB”):

    注意+号表示大于-号表示小于
    # find /var/log -size +1G -print

    或者,也许您想在/ data中找到ccn拥有的所有文件:

    # find /data -owner ccn

    您也可以根据权限查找文件。也许您想在主目录中找到所有世界可读的文件,以确保您不会共享过多文件。

    # find ~ -perm -o=r 
    # find ~ -perm 755 -print |more   #~代表的是$home目录,查找权限为755的文件
    # find . -perm 700 -name "u_*" -print |more  #查找所有以产u_开头的,并且权限为700的文件
    # find . -perm /222    #搜索某人(其所有者或他们的小组或其他任何人)
    # find . -perm /220
    # find . -perm /u+w,g+w
    # find . -perm /u=w,g=w       ##这三个命令都执行相同的操作,但是第一个使用文件模式的八进制表示形式,另外两个使用符号形式。这些命令都将搜索以下文件可由其所有者或他们的组写。文件没有所有人和团体均可写成相符;要么会做。
    # find . -perm -220
    # find . -perm -g+w,u+w
    #这两个命令都做同样的事情。搜索以下文件他们的主人和他们的小组都可以写
    #   find . -perm -444 -perm /222 ! -perm /111
    #   find . -perm -a+r -perm /a+w ! -perm /a+x
    #这两个命令都搜索可读的文件每个人(-perm -444或-perm -a + r),至少有一个写位设置(-perm / 222或-perm / a + w),但任何人都不可执行(!-perm/ 111和!-perm / a + x)。
    prune来忽略目录来查找
    # find . -name "*.gz"  -prune -o ( ! -name aaa )  -print  #查找在前目录中,不在以aaa结尾的目录中的,不以gz结尾的文件
    #       cd /source-dir
    #       find . -name .snapshot -prune -o ( ! -name '*~' -print0 )|cpio -pmd0 /dest-dir

    #此命令将/ source-dir的内容复制到/ dest-dir,但是省略名为.snapshot的文件和目录(以及其中的任何内容)。它还会省略名称以〜结尾的文件或目录,但不会他们的内容。-prune -o (... -print0 )的构造相当共同。这里的想法是-prune之前的表达式匹配要修剪的东西。
    但是,-prune操作本身返回true,因此以下-o确保右侧为仅针对未修剪的目录评估(修剪目录的内容甚至都不会被访问,因此它们的内容内容无关)。右侧的表达-o放在括号中只是为了清楚起见。它强调-print0操作仅对没有-prune的事物发生适用于他们。
    因为两次测试之间的默认“和”条件绑定比-o更紧密,无论如何这是默认设置,但是括号有助于显示发生了什么。
    通过名字来查找
    # find ~ -name memcached.pid -print   #查找home目录下文件名为memcache.pid的文件
    # find . -name "*.pid" -print      #.代表当前目录,查找所有以pid结尾的文件
    # find ~ -name "[0-9]*.pid" -print   #查找以数字开头的所有pid文件,在这里要说[0-9]*不能匹配23,它跟一般的语言类正则不太一样,shell里面的*可以代表一切字符(单个,多个都行),如果想匹配2345只能这样写[0-9][0-9][0-9][0-9]
    根据文件类型来查找文件
    # find . -type d -print   #查找当前目录下面的目录
    # find . ! -type d -print  #找当前目录下面的非目录文件
    # find /tmp -type f,d,l   #搜索目录中的文件,目录和符号链接/ tmp将这些类型作为逗号分隔的列表(GNU扩展)传递,在其他方面,这等效于更长,但更便于移植
    # find /tmp ( -type f -o -type d -o -type l ) #搜索具有特定名称的文件,并在我们找到第一个
    根据文件所属用户和用户组来找文件
    # find . -nouser -print  #查找当前目录中,没有归属的文件
    # find . -user ccn -group users -print  #查找用户组为users,所属用户为ccn的文件
    exec执行命令
    # find . -type f -size +1000000c -exec ls -al {} ;  #显示当前目录下面所有大于1000000的文件,exec后面执行了一个命令,{}这个代表文件名
    # find ./ -name "null_*" -exec basename {} ; | sort   #搜索文件,并只显示文件名,以升序排列。
    # find . -name 'del.txt' -ok rm {} ;   #查找 del.txt 并删除,删除前提示确认 
    # find . -name 'aa.txt' -exec cp {} {}.bak ;  #查找 aa.txt 并备份为aa.txt.bak
    # find . -type f -exec ls -l {} ;   #查当前目录下的所有普通文件
    # find logs -type f -mtime +5 -exec   -ok   rm {} ; #在 /logs 目录中查找更改时间在5日以前的文件并删除它们
    # find   ./   -mtime   -1   -type f   -exec   ls -l   {} ; #查询当天修改过的文件

    查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
    # find /home -type d -print -exec ls {} ;

    Find -exec与Find   |xargs

    如果要按模式搜索文件,然后将某些内容应用于结果,则至少有两个选择。您可以使用查找。-exec或将结果通过管道传递给xargs。find -exec和find |还有两种不同的选择。会对性能产生巨大影响的xargs。那么有什么区别,应该选择哪一个呢?

    我们从一个非常基本的例子开始

    1、在文件中搜索

    仅搜索以.php结尾的文件,并在这些文件中查找字符串$ test:

    # find -exec ;
    find . -name *.php -type f -exec grep -Hn '$test' {} ;
    
    # find -exec +
    find . -name *.php -type f -exec grep -Hn '$test' {} +
    
    # find | xargs -n1
    find . -name *.php -type f -print0 | xargs -0 -n1 grep -Hn '$test'
    
    # find | xargs
    find . -name *.php -type f -print0 | xargs -0 grep -Hn '$test'

    他们似乎都一样。让我们看看他们是否都找到相同数量的结果:

    # Getting directory size
    # '| wc -l' will print the number of lines found instead of the results
    
    # time find -exec ;
    find . -name *.php -type f -exec grep -Hn '$test' {} ; | wc -l
       2213
    
    # find -exec +
    find . -name *.php -type f -exec grep -Hn '$test' {} + | wc -l
       2213
    
    # find | xargs -n1
    find . -name *.php -type f -print0 | xargs -0 -n1 grep -Hn '$test' | wc -l
       2213
    
    # find | xargs
    find . -name *.php -type f -print0 | xargs -0 -grep -Hn '$test' | wc -l
       2213

    两者也没什么不同,让我们详细了解一下命令

    1.1 What is equal in find -exec

    find .
    # find all files, folders, symlinks, etc in the current directory recursively
    
    find . -name *.php
    # find all files, folders, symlinks, etc in the current directory recursively
    # Its filename must end with .php
    
    find . -name *.php -type f
    # find all files, folders, symlinks, etc in the current directory recursively
    # Its filename must end with .php
    # Only search for files (not folders)
    
    find . -name *.php -type f -exec [cmd]
    # find all files, folders, symlinks, etc in the current directory recursively
    # Its filename must end with .php
    # Only search for files (not folders)
    # Execute a command on the results

    对于所有三个查询,以上内容均相同。让我们看一下grep命令

    grep -H
    # -H  Always print filename headers with output lines.
    
    grep -Hn
    # -H  Always print filename headers with output lines.
    # -n  Each output line is preceded by its relative line number in the file, starting at line 1. 

    1.2 What is different in find -exec

    1.2.1 find ;

    find . [args] -exec [cmd] {} ;   {}是find找到的结果的占位符,;是对于每个找到的结果,命令(在本例中为“ grep”)与找到的结果一起执行一次

    1.2.2 find +

    # find . [args] -exec [cmd] {} +     + 将所有结果行连接起来,并且仅将一次执行命令(在本例中为“ grep”),并将所有找到的结果作为参数

    1.3 What is equal in find | xargs

    # find . [args] -print0 | xargs -0 [cmd] # -print0 告诉find将所有结果打印到std,每个结果都用ASCII NUL字符“  000”分隔. -0 告诉xargs输入将以ASCII NUL字符“  000”分隔

    1.4 What is different in find | xargs

    1.4.1 xargs with -n1

    # find .[args] -print0 | xargs -0 -n1 [cmd]   #-n 告诉xarg仅使用一个参数执行命令[cmd](在这种情况下,find仅找到一个文件)。这等于
    # find . -exec [cmd] {} ;
     

    翻译 朗读 复制 正在查询,请稍候…… 重试 朗读 复制 复制 朗读 复制 via 谷歌翻译(国内)

  • 相关阅读:
    txt文本处理---行未添加逗号
    wav转txt格式的代码实现(c,python)
    程序员的健康--预防
    程序员的健康--病因
    朴素贝叶斯算法简介及python代码实现分析
    hdf 5文件格式及python中利用h5py模块读写h5文件
    C 语言restrict 关键字的概念及使用例子
    一个程序员卑微的目标
    【ES】学习4-结构化搜索
    【python】正则表达式中的转义问题
  • 原文地址:https://www.cnblogs.com/suixinnan/p/13554492.html
Copyright © 2011-2022 走看看