Linux find命令的基本语法如下:
find [path] [expression]
path:要查找的目录路径。
expression:查找表达式,指定要查找的文件类型、名称、大小等条件
例子:find /etc -name 'passwd'
这个表达式,指定条件为找到文件名是passwd的文件。对于find命令,最需要学习的是表达式这一段。表达式决定了我们要找的文件是什么属性的文件,还可以指定一些“动作”,比如将匹配某种条件的文件删除。所以,find命令的核心就是表达式(EXPRESSION)的指定方法。
find命令中的表达式有四种类型,分别是:
Tests:就是我们最常用的指定查找文件的条件。
Actions:对找到的文件可以做的操作。
Global options:全局属性用来限制一些查找的条件,比如常见的目录层次深度的限制。
Positional options:位置属性用来指定一些查找的位置条件。
要查找特定类型的文件,您可以使用Linux find命令的-type选项。例如,如果您要查找所有的文本文件,可以使用以下命令:
find /path/to/search -type f -name "*.txt"
在上面的命令中:
/path/to/search是您要查找的目录路径。
-type f表示要查找的是文件类型。
-name "*.txt"表示要查找以.txt结尾的文件。* 代表模糊查询
如果您知道要查找的文件的名称,可以使用-name选项来查找它。例如,要查找名为file.txt的文件,可以使用以下命令:
find /path/to/search -type f -name "file.txt"
在上面的命令中,-name选项指定要查找的文件名为file.txt。
要查找特定大小的文件,您可以使用-size选项。例如,要查找大小为10MB的文件,可以使用以下命令:
find /path/to/search -type f -size 10M
在上面的命令中,-size选项指定要查找的文件大小为10MB。
如果您想查找最近修改的文件,可以使用-mtime选项。例如,要查找最近7天内修改过的文件,可以使用以下命令:
find /path/to/search -type f -mtime -7
在上面的命令中,-mtime选项指定查找最近7天内修改过的文件。
-mtime n:查找文件修改时间,单位是天,就是n*24小时。
find / -mtime 7 -ls
我们为了方便看到结果,在这个命令中使用了-ls参数,具体细节后面会详细解释。再此我们只需要知道这个参数可以将符合条件的文件的相关属性显示出来即可。那么我们就可以通过这个命令看到查找到的文件的修改时间了。
? 524295 ? ? ?4 drwxr-xr-x ?12 ?root ? ? root ? ? ? ? 4096 6月 ?8 13:43 /root/.config
? 524423 ? ? ?4 drwxr-xr-x ? 2 ?root ? ? root ? ? ? ? 4096 6月 ?8 13:43 /root/.config/yelp
? 524299 ? ? ?4 drwxr-xr-x ? 2 ?root ? ? root ? ? ? ? 4096 6月 ?8 13:23 /root/.config/dconf
? 524427 ? ? ?4 -rw-r--r-- ? 1 ?root ? ? root ? ? ? ? 3040 6月 ?8 13:23 /root/.config/dconf/user
我们会发现,时间都集中在6月8号,不加”-“的话指定的是,找到了距离现在7个24小时之前修改过的文件。如果我们在考究一下细节的话,可以使用这个命令再将找到的文件用时间排下顺序:
find / -mtime 7 -exec ls -tld {} \+
我们会发现,找到的文件实际上是集中在6月7日的14:30到6月8日的14:30这个范围内的。就是说,实际上,指定7天的意思是说,找到文件修改时间范围属于距离当前时间7个24小时到8个24小时之间的文件,这是不加任何+-符号的7的含义。
find / -mtime -7 -exec ls -tld {} \+
从现在开始到7个24小时范围内的文件。但是不包括7个24小时到8个24小时的时间范围。
这就是find指定时间的含义。类似的参数还有:
-ctime:以天为单位通过change time查找文件。
-atime:以天为单位通过access time查找文件。
-mmin:以分钟为单位通过modify time查找文件。
-amin:以分钟为单位通过access time查找文件。
-cmin:以分钟单位通过change time查找文件。
这些参数都是指定一个时间数字n,数字的意义跟mtime完全一样,只是时间的单位和查找的时间不一样。
要查找空文件或目录,可以使用-empty选项。例如,要查找空目录,可以使用以下命令:
find /path/to/search -type d -empty
在上面的命令中,-type d指定查找的是目录类型,-empty选项指定查找空目录。
要查找特定权限的文件,可以使用-perm选项。
-executable:文件可执行。
-readable:文件可读。
-writable:文件可写。
-perm mode:查找权限为mode的文件,mode的写法可以是数字,也可以是ugo=rwx的方式
例如,要查找所有用户可读、可写和可执行的文件,可以使用以下命令:
find /path/to/search -type f -perm 777
在上面的命令中,-perm选项指定要查找的文件权限为777,这意味着所有用户都具有读、写和执行权限。
您可以将多个选项组合在一起来查找更精确的结果。例如,要查找所有的图片文件(.jpg或.png)和大小不超过1MB的文件,可以使用以下命令:
find /path/to/search -type f \( -name "*.jpg" -o -name "*.png" \) -size -1M
在上面的命令中,(和)用于将-name选项组合在一起,表示查找以.jpg或.png结尾的文件;-size选项指定查找大小不超过1MB的文件。
ps:使用-o作为逻辑 OR 条件的选项运行一次
find命令的exec是一个非常好用的参数,当然其可能造成的破坏也可能非常大。在学习它之前,我先要提醒大家,使用之前千万要确定自己在做什么。
这个参数的常见格式是:
-exec command ;
注意后面的分号。它是用来给find做标记用的。find在解析命令的时候,要区分给定的参数是要传给自己的还是要传给command命令的。所以find以分号作为要执行命令所有参数的结束标记。命令返回值为0则返回true。在exec参数指定的执行命令中,可以使用{}符号表示当前find找到的文件名。比如:
find /etc/ -name 'passwd' -exec echo {} \;
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
上面的命令表示,找到/etc/目录下文件名为passwd的文件,并echo其文件名。注意再使用分号的时候前面要加转移字符\,因为分号也是bash的特殊字符,所以bash会先解释它。前面加上\就可以让bash直接将其船体给find命令,这个分号由find解释,而不是bash。其实这个exec用的比较废话,毕竟find本身就会找到相关条件的文件并显示其文件名。但是试想如果我们将echo换成rm或者cp,是不是就有意义的多?比如:
find /etc/ -name 'passwd' -exec rm {} \;
请不要执行这个命令!!
或者:
find /etc/ -name 'passwd' -exec cp {} {}.bak \;
这个命令可以将符合条件的文件都加个.bak后缀备份一份。于是我们可以执行删除了:
find /etc/ -name 'passwd.bak'
/etc/default/passwd.bak
/etc/pam.d/passwd.bak
/etc/passwd.bak
find /etc/ -name 'passwd.bak' -exec rm {} \;
find /etc/ -name 'passwd.bak'
当然,删除前还是要确认清楚你要删的文件一定是对的。