zoukankan      html  css  js  c++  java
  • Linux find命令

    Linux find命令

    Linux find命令是命令行上非常有用和方便的搜索文件的命令。它可用于根据各种搜索标准查找文件,如权限,用户所有权,修改时间/日期,大小等。在这篇文章中,我们将学习使用find命令以及它支持的各种选项。

    大多数Linux发行版find命令默认是可用的,因此你不必安装任何软件包。在Linux上,如果你想高效的使用Linux命令行,find命令是必须学习的。

    基本的find命令语法如下

    $ find location comparison-criteria search-term
    

    1. 列出当前目录及子目录下的所有文件

    这条命令列出当前目录中的所有文件以及当前目录中的子目录。

    # find
    .
    ./abc.txt
    ./cool.php
    ./subdir
    ./subdir/how.php
    

    这条命令与以下命令等价

    # find .
    # find . -print
    

    2. 搜索指定目录或路径

    以下命令将查找当前目录中test目录下的文件,默认情况下将列出所有文件。

    # find ./test
    ./test
    ./test/abc.txt
    ./test/cool.php
    ./test/subdir
    ./test/subdir/how.php
    

    以下命令通过文件名搜索文件

    # find ./test -name "abc.txt"
    ./test/abc.txt
    

    我们也可以使用通配符

    # find ./test -name "*.php"
    ./test/cool.php
    ./test/subdir/how.php
    

    请注意,所以有的子目录都是被递归搜索的。因此,这是查找给定扩展名所有文件的一种非常强大的方法。

    尝试搜索根目录"/",将会搜索整个文件系统包括挂载设备和网络存储设备。 所以要小心,当然你们可以随时通过Ctrl + c中止命令。

    当指定目录时(本例中为"./test"),可以省略尾部的斜线,然而,如果目录是指向其他位置的链接时,为了使它工作正常,你必须指定尾部的斜线(find ./test/ ...)

    忽略大小写

    当搜索文件名时忽略大小写通常很有用。为了忽略大小写,只需使用"iname"选项替代"name"选项。

    # find ./test -iname "*.Php"
    ./test/cool.php
    ./test/subdir/how.php
    

    将搜索项(名称参数)添加单引号或双引号总是更好的做法。
    不这样做看起来有时候会起作用,其他时候又会给出奇怪的结果。

    3. 限制目录遍历的深度

    默认情况下,find命令递归的遍历整个目录树。非常消耗时间和资源。然而,可以指定目录遍历的深度。例如,我们不想遍历2,3级子目录,这可以使用maxdepth选项完成。

    ]# find ./test -maxdepth 2 -name '*.php'
    ./test/cool.php
    ./test/subdir/how.php
    
    # find ./test -maxdepth 1 -name '*.php' 
    ./test/cool.php
    

    第二个示例使用maxdepth 1选项,它意味着不会搜索超过1级深度,仅在当前目录中。

    当我们希望限制搜索仅在当前目录或最大1级深度子目录,这很有用,不必搜索整个目录,而这将需要大量时间 。

    就像maxdepth一样,有一个名为mindepth的选项可以实现如其名称所暗示的功能,它将至少搜索n级深度。

    4. 反转匹配

    也可以搜索与指定名称或模式不匹配的文件,当我们知道要从搜索中排除哪些文件时,这很有用。

    # find ./test -not -name '*.php'
    ./test
    ./test/abc.txt
    ./test/subdir
    

    所以在上面的例子中我们发现所有没有php扩展名的文件,都是非php文件。find命令也支持用感叹号替代not

    # find ./test ! -name '*.php'    
    ./test
    ./test/abc.txt
    ./test/subdir
    

    5. 组合多个搜索条件

    当指定名称或反转时可以使用多个条件。例如:

    # find ./test -name 'abc*' ! -name '*.php'
    ./test/abc.txt
    

    上面的find命令查找文件名以abc开头同时扩展名不是php的文件。这是一个使用find命令构建强大的搜索表达式的示例

    OR操作符

    当使用多个名称条件时,find命令将用and操作符组合他们,这意味着只有当文件符合所有条件时才被匹配。然而,如果我们需要执行一个基于or的匹配,find也有'o'开关。

    # find ./test -name '*.php' -o -name '*.txt'
    ./test/abc.txt
    ./test/cool.php
    ./test/subdir/how.php
    

    上面的命令搜索以php或txt为扩展名结尾的文件

    6. 仅搜索文件或目录

    有时候,我们希望仅查找指定名称的文件或目录。find能够轻松的实现。

    # find ./test -name 'abc*'
    ./test/abc.txt
    ./test/abc
    
    Only files
    
    # find ./test -type f -name 'abc*'
    ./test/abc.txt
    
    Only directories
    # find ./test -type d -name 'abc*' 
    ./test/abc
    

    相当有用和方便

    7. 一起搜索多个目录

    因此,假如你希望在2个单独的目录中进行搜索,同样,命令非常简单

    # find ./test ./dir2 -type f -name 'abc*'
    ./test/abc.txt
    ./dir2/abcdefg.txt
    

    检查它是否列出了2个独立目录中的文件

    8. 查找隐藏文件

    Linux中隐藏文件以点号开头(.), 因此,它很容易在名称条件中指定和显示所有隐藏文件。

    # find ~ -type f -name '.*'
    

    9. 查找特定权限的文件

    find命令可以使用"perm"来查找指定权限的文件。下列的命令查找权限为0644的文件。

    # find . -type f -perm 0644
    ./abc.txt
    ./cool.php
    ./subdir/how.php
    ./abc.php
    

    这对查找赋予了错误权限的文件很有用,这些文件可能导致安全问题。取反也可用于权限检查。

    # find . -type f ! -perm 0777
    ./abc.txt
    ./cool.php
    ./subdir/how.php
    ./abc.php
    

    10. 查找设置了sgid/suid位的文件

    find命令的"perm"选项接收与chmod命令一样的字符模式。下列的命令查找所有权限为644以及设置了sgid位的文件。

    # find / -perm 2644
    

    类似地,使用1644查找权限为644并设置了粘滞位的文件,"perm"也支持使用替代语法而不是八进制数。

    # find / -maxdepth 3 -perm /u=s 2>/dev/null 
    /usr/bin/fusermount
    /usr/bin/chfn
    /usr/bin/chsh
    /usr/bin/chage
    /usr/bin/gpasswd
    /usr/bin/newgrp
    /usr/bin/staprun
    /usr/bin/mount
    /usr/bin/crontab
    /usr/bin/su
    /usr/bin/umount
    /usr/bin/pkexec
    /usr/bin/sudo
    /usr/bin/passwd
    /usr/sbin/pam_timestamp_check
    /usr/sbin/unix_chkpwd
    /usr/sbin/usernetctl
    

    注意,“2>/dev/null"删除了带有"权限错误”的条目。

    11. 查找只读文件

    查找所有只读文件

    oot 66176 Aug  4  2017 /bin/ping
    [root@lanquark test]# find /etc -maxdepth 1 -perm /u=r
    /etc
    /etc/fstab
    /etc/crypttab
    /etc/mtab
    /etc/resolv.conf
    ...省略后续输出
    

    12. 查找可执行文件

    下面的命令将查找可执行文件

    [root@lanquark test]# find /usr/bin -maxdepth 2 -perm /a=x
    /usr/bin/cp
    /usr/bin/lua
    ...省略后续输出
    

    13. 查找特殊用户拥有的文件

    在所有者为root的/root目录下,查找所有或单个名称为tecmint.txt的文件

    # find . -user root
    .
    ./abc.txt
    ./cool.php
    ./subdir
    ./subdir/how.php
    ./abc
    ./abc.php
    

    我们也可以指定文件的名称或者任何与用户条件相关的名称条件。

    # find . -user root -name '*.php'
    ./cool.php
    ./subdir/how.php
    ./abc.php
    

    显而易见,我们可以如何构建条件以缩小我们匹配的搜索范围。、

    14. 搜索属于组的文件

    搜索属于某个特定组的所有文件

    # find . -group hjm
    ./abc.txt
    

    你知道你可以使用~符号搜索你的家目录吗?

    # find ~ -name abc.txt
    /root/abc.txt
    /root/test/abc.txt
    

    很简单

    搜索文件和目录基于修改日期和时间

    另一个find命令支持的重要搜索条件是修改和访问日期/时间。当我们想要找出特定时间和日期范围修改的文件时非常方便。让我们来看一些小例子。

    16. 查找访问时间距当前日期N天的文件(时间点)

    # find / -atime 50
    

    17. 查找某个时间范围内修改的文件

    查找修改时间在50以前,100天以内的所有文件

    # find / -mtime +50 -mtime -100
    

    18. 查找最近N分钟内属性更改的文件。

    查找最近1小时内属性更改的文件。

    # find . -cmin -60
    

    19. 查找最近1小时内内容更改的文件。

    查找最近1小时内文件内容更改的所有文件。

    # find / -mmin -60 
    

    20. 查找最近1小时内访问的文件

    查找最近1小时内访问的所有文件。

    # find / -amin -60
    

    21. 查找指定大小的文件

    基于大小查找文件和目录,查找甩的50M的文件,使用

    # find / -size 50M
    

    22. 查找文件大小在指定范围内的文件。

    查找所有大于50M小于100M的文件

    # find / -size +50M -size -100M
    

    23. 查找最大和最小的文件

    find命令结合ls和sort命令可以列出最大的文件。
    下述命令将显示当前目录和它的子目录下最大的5个文件。这将需要一点时间,取决于命令处理的文件数量。

    # find . -type f -exec ls -s {} ; | sort -n | head -5
    

    24. 查找空文件和目录

    下列命令使用find命令的"空"选项查找所有空文件。

    # find /etc -type f -empty
    

    查找所有的空目录使用类型"d"

    # find /etc -type d -empty
    

    真的非常简单和容易

    一些高级的操作

    find命令不仅可以通过一些条件查找文件,它也可以使用任何linux命令对这些文件进行操作。例如,我们想删除一些文件。

    下面是一些简单的例子。

    25. 列出找到的文件

    假设我们用find命令找到了文件,现要想要像ls命令那样列出它们,它很简单。

    # find . -exec ls -ld {} ;
    drwxr-xr-x. 4 root root 77 Nov 19 20:28 .
    -rw-r--r--. 1 root hjm 0 Nov 10 22:55 ./abc.txt
    -rw-r--r--. 1 root root 0 Nov 10 22:55 ./cool.php
    drwxr-xr-x. 2 root root 21 Nov 19 20:30 ./subdir
    -rw-r--r--. 1 root root 0 Nov 19 20:30 ./subdir/how.php
    drwxr-xr-x. 2 root root 6 Nov 11 00:49 ./abc
    -rw-r--r--. 1 root root 0 Nov 19 20:28 ./abc.php
    

    26. 删除所有匹配的文件或目录

    下面的命令将删除tmp目录下的所有txt文件。

    # find /tmp -type f -name '*.txt' -exec rm -f {} ;
    

    同样的操作也可以在目录上执行,只需要用type d代替type f

    让我们再看一个我们想要删除大于100M的文件的例子

    # find /root -type f -name '*.log' -size +10M -exec rm -f {} ;
    

    总结

    这是一个关于linux find命令的快速教程。find命令是linux
    终端下最基本的命令,它让搜索文件非常容易,它是系统管理所必须的。因此,学习它。如果有问题,可以在下面的评论区留言。

    原文:https://www.binarytides.com/category/linux/linux-commands/

  • 相关阅读:
    操作系统(32-45)
    异或运算( ^ )
    计算机网络(16—30)
    操作系统(13-30)
    win7 linux双系统删除linux
    ubuntu安装matplotlib包
    vmware+CentOS 7 无法上网
    Python命令行清屏的简单办法
    jupyter notebook 工作目录修改
    ipython notebook设置工作路径和自动保存.py文件 ipython_notebook_config.py
  • 原文地址:https://www.cnblogs.com/minn/p/9986188.html
Copyright © 2011-2022 走看看