侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux find命令教程(用法详解):如何在Linux系统中搜索文件和目录

Linux find命令介绍

find命令是Linux系统中的一个非常强大和灵活的命令,它可以根据各种条件在指定的目录下搜索文件和目录,不仅仅是按照文件名。例如,它可以搜索空文件、可执行文件、特定用户拥有的文件等。它还可以按照访问或修改时间、正则表达式等方式列出文件。它默认是递归的,也就是说它会搜索当前目录及其所有子目录。它还可以处理一些特殊的文件类型,如符号链接、命名管道、套接字等。所有这些都非常有用。find命令真的很强大。但是,我们还可以利用它的强大功能,将搜索的结果传递给其他命令进行进一步的处理。这样我们就可以对find命令发现的文件和目录做一些操作。

适用的Linux版本

find命令是GNU项目的一部分,因此它在大多数Linux发行版中都是可用的。如果你使用的是一个没有预装find命令的Linux系统,你可以使用以下命令来安装它:

  • 对于基于Debian或Ubuntu的系统,使用apt-get命令:
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install findutils
  • 对于基于Red Hat或CentOS的系统,使用yum或dnf命令:
[linux@bashcommandnotfound.cn ~]$ sudo yum install findutils

或者

[linux@bashcommandnotfound.cn ~]$ sudo dnf install findutils
  • 对于基于Arch Linux的系统,使用pacman命令:
[linux@bashcommandnotfound.cn ~]$ sudo pacman -S findutils

Linux find命令的基本用法

find命令的一般语法格式如下:

find [path] [options] [expression]

其中:

  • path 是要搜索的目录路径,可以是一个或多个目录或文件名,多个路径之间用空格分隔。如果未指定路径,则默认为当前目录(.)。
  • options 是指定搜索类型的选项,比如按照文件名、文件类型、文件大小等进行过滤。这些选项有很多,我们会在后面介绍一些常用的。
  • expression 是指定搜索条件的表达式,可以是一个或多个测试、操作或逻辑运算符组成的复合表达式。如果未指定表达式,则默认为-print,即打印出所有匹配的文件名。

Linux find命令的常用选项说明

find命令有很多选项,我们这里只介绍一些最常用的。如果你想了解更多,请参考官网。

  • -name pattern :按照文件名进行搜索,支持使用通配符*和?。
  • -iname pattern :与-name类似,但是忽略大小写。
  • -type type :按照文件类型进行搜索,可以是以下字符之一:
    • f :普通文件。
    • d :目录。
    • l :符号链接。
    • c :字符设备。
    • b :块设备。
    • p :命名管道(FIFO)。
    • s :套接字。
  • -size [+-]size[cwbkMG] :按照文件大小进行搜索,支持使用+或-表示大于或小于指定大小,单位可以是以下字符之一:
    • c :字节(默认单位)。
    • w :双字节(16位)。
    • b :块(512字节)。
    • k :千字节(1024字节)。
    • M :兆字节(1024*1024字节)。
    • G :吉字节(102410241024字节)。
  • -mtime n :按照修改时间进行搜索,n是一个整数表示天数。支持使用+或-表示在n天前或后修改的文件,或者使用n表示正好在n天前修改的文件。
  • -atime n :按照访问时间进行搜索,n是一个整数表示天数。支持使用+或-表示在n天前或后访问的文件,或者使用n表示正好在n天前访问的文件。
  • -ctime n :按照状态改变时间进行搜索,n是一个整数表示天数。支持使用+或-表示在n天前或后状态改变的文件,或者使用n表示正好在n天前状态改变的文件。
  • -user name :按照文件所有者进行搜索,name是一个用户名或用户ID。
  • -group name :按照文件所属组进行搜索,name是一个组名或组ID。
  • -perm mode :按照文件权限进行搜索,mode是一个八进制或符号表示的权限模式。支持使用+或-表示包含或匹配指定的权限位。
  • -exec command {} ; :对搜索到的每个文件执行command命令,其中{}代表文件名,;代表命令结束符。注意{}和;之间要有空格。
  • -exec command {} + :类似于-exec command {} ;,但是会将多个文件名作为command的参数一次执行,而不是每个文件执行一次command。
  • -ok command {} ; :类似于-exec command {} ;,但是会在执行command之前询问用户是否确认。
  • -print :打印出搜索到的文件名,这是默认的操作,通常可以省略。
  • -print0 :类似于-print,但是使用空字符(\0)而不是换行符(\n)分隔文件名。这样可以避免文件名中包含空格或特殊字符时造成的问题。

Linux find命令的实例

下面我们来看一些find命令的实例,以加深对它的理解和掌握。

1. 在当前目录及其子目录中查找名为foo.txt的文件:

[linux@bashcommandnotfound.cn ~]$ find . -name foo.txt
./foo.txt
./bar/foo.txt

2. 在/home目录及其子目录中查找名为foo.txt或Foo.txt的文件:

[linux@bashcommandnotfound.cn ~]$ find /home -iname foo.txt
/home/seth/foo.txt
/home/seth/Documents/Foo.txt

3. 在当前目录及其子目录中查找所有以.txt结尾的文件:

[linux@bashcommandnotfound.cn ~]$ find . -name "*.txt"
./foo.txt
./bar/foo.txt
./bar/baz.txt
./qux/quux.txt

4. 在当前目录及其子目录中查找所有类型为目录的文件:

[linux@bashcommandnotfound.cn ~]$ find . -type d
.
./bar
./qux

5. 在当前目录及其子目录中查找所有类型为符号链接的文件:

[linux@bashcommandnotfound.cn ~]$ find . -type l
./link1 -> foo.txt
./link2 -> bar/foo.txt

6. 在当前目录及其子目录中查找所有大小为0字节的文件:

[linux@bashcommandnotfound.cn ~]$ find . -size 0c
./empty1.txt
./empty2.txt

7. 在当前目录及其子目录中查找所有大小大于1M字节的文件:

[linux@bashcommandnotfound.cn ~]$ find . -size +1M
./bigfile1.dat
./bigfile2.dat

8. 在当前目录及其子目录中查找所有今天修改过的文件:

[linux@bashcommandnotfound.cn ~]$ find . -mtime 0
./foo.txt
./bar/foo.txt

9. 在当前目录及其子目录中查找所有一周以前修改过的文件:

[linux@bashcommandnotfound.cn ~]$ find . -mtime +7
./oldfile1.txt
./oldfile2.txt

10. 在当前目录及其子目录中查找所有属于seth用户的文件:

[linux@bashcommandnotfound.cn ~]$ find . -user seth
./seth.txt
./bar/seth.txt

11. 在当前目录及其子目录中查找所有属于staff组的文件:

[linux@bashcommandnotfound.cn ~]$ find . -group staff
./staff.txt
./bar/staff.txt

12. 在当前目录及其子目录中查找所有权限为755的文件:

[linux@bashcommandnotfound.cn ~]$ find . -perm 755
./script1.sh
./script2.sh

13. 在当前目录及其子目录中查找所有权限包含可执行位的文件:

[linux@bashcommandnotfound.cn ~]$ find . -perm /a+x
./script1.sh
./script2.sh
./link1 -> foo.txt
./link2 -> bar/foo.txt

14. 在当前目录及其子目录中查找所有名为foo.txt的文件,并删除它们:

[linux@bashcommandnotfound.cn ~]$ find . -name foo.txt -exec rm {} \;

15. 在当前目录及其子目录中查找所有名为foo.txt的文件,并将它们复制到/tmp目录下:

[linux@bashcommandnotfound.cn ~]$ find . -name foo.txt -exec cp {} /tmp \;

Linux find命令的注意事项

  • find命令默认是递归的,也就是说它会搜索指定路径下的所有子目录。如果你只想搜索指定路径下的一级目录,你可以使用-maxdepth 1选项来限制搜索深度。
  • find命令支持使用逻辑运算符(-and, -or, -not)和括号((, ))来组合多个条件。注意括号需要用反斜杠转义,否则会被shell解释。例如,如果你想查找当前目录下所有以.txt结尾并且大小大于1M字节的文件,你可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ find . \( -name "*.txt" -and -size +1M \)
  • 如果你想忽略某些路径或文件,你可以使用-prune选项来排除它们。例如,如果你想在当前目录下搜索所有以.txt结尾的文件,但是忽略bar目录,你可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ find . -name bar -prune -o -name "*.txt" -print
./foo.txt
./qux/quux.txt
  • 如果你想在搜索结果中显示更多的信息,你可以使用-ls选项来列出文件的详细属性。例如,如果你想在当前目录下搜索所有以.txt结尾的文件,并显示它们的大小、权限、所有者、组、修改时间等信息,你可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ find . -name "*.txt" -ls
  1234    4 -rw-r--r--   1 seth    staff        1024 Oct 31 09:24 ./foo.txt
  2345    4 -rw-r--r--   1 seth    staff        1024 Oct 31 09:24 ./bar/foo.txt
  3456    4 -rw-r--r--   1 seth    staff        1024 Oct 31 09:24 ./bar/baz.txt
  4567    4 -rw-r--r--   1 seth    staff        1024 Oct 31 09:24 ./qux/quux.txt
1

评论区