find命令详解

find命令详解

linux shell 中的find命令,可以列出当前目录及子目录的所有文件和文件夹。

具体使用如下:
 
1.根据文件名或正则表达式匹配搜索
find /home -name "*.txt"
选项-name的参数指定了文件名所必须匹配的字符串
 
find . -iname "example*"
选项-iname的参数表示忽略字母的大小写
 
find . \( -name "*.txt" -o -name "*.pdf" \)
采用or条件可以匹配多个条件中的一个。
 
find /home/users -path "*slynux*"
选项-path的参数可以使用通配符来匹配文件路径或文件。-name只能用给定的文件名进行匹配。
 
find . -regex ".*\(\.py\|\.sh\)$"
选项 -regex 是基于正则表达式来匹配文件路径的。类似的-iregex用于忽略正则表达式的大小写。
 
2.否定参数
find也可以用"!"否定参数的含义。例如
find . ! -name "*.txt"
表示匹配所有不以.txt结尾的文件名。
 
3.基于目录深度的搜索
find命令在使用时会遍历所有的子目录。我们可以采用一些深度参数来限制find命令遍历的深度。-maxdepth和-mindepth
例如:
find . -maxdepth 1 -type f
表示将find的命令向下的最大深度限制为1,该命令只列出当前目录的所有普通文件,目录则不会被列出。
-mindepth类似于-maxdepth,不过它设置的是find遍历的最小深度。
 
4.根据文件类型搜索
 -type选项可以对文件搜索进行过滤。
只列出所有的目录
find . -type d
 
只列出普通的文件
find . -type f
 
只列出符号链接
find . -type l
 
下面的表列出了type参数的所有文件类型:
普通文件 f
符号链接 l
目录     d
字符设备 c
块设备   b
套接字   s
fifo     p
 
5.根据文件时间进行搜索
linux文件系统中的每一个文件都有三种时间戳:
访问时间(-atime):最近一次访问文件的时间
修改时间(-mtime):文件内容最后一次被修改的时间
变化时间(-ctime):文件元数据最后一次改变的时间。
 
-atime,-mtime,-ctime 可以作为find的时间参数。他们可以整数值给出,单位是天。这些整数值通常还得有-或+,表示小于或大于。
 
打印出在最近7天内被访问过的所有文件:
find . -type f -atime -7
打印出恰好在七天前被访问过的所有文件:
find . -type f -atime 7
打印出访问时间超过7天的所有文件:
find . -type f -atime +7
 
类似的,我们可以根据修改时间,用-mtime进行搜索,也可以根据变化时间,用-ctime进行搜索。
还有其他一些基于分钟为计量单位的参数:
-amin 访问时间
-mmin 修改时间
-cmin 变化时间
例如:打印访问时间超过7分钟的所有文件:
find . -type f -amin +7
 
-newer 选项找出比参考文件更新的所有文件。
例如,找出比file.txt修改时间更长的所有文件:
find . -type f -newer file.txt
 
6.基于文件大小的搜索
根据文件的大小,可以这样搜索:
 
find . -type f -size +2k
找出大于2kb的文件
 
find . -type f -size -2k
找出小于2kb的文件
 
find . -type f -size 2k
找出等于2kb的文件
除了k之外,还可以用跟其他文件大小单元。
b 块
c 字节
w 字
k 千字节
M 兆字节
G G字节
 
7.删除匹配的文件
-delete可以用来删除find查找到的匹配文件。
find . -type f -name "*.swp" -delete
 
8.基于文件权限和所有权的匹配
用-perm参数就可以根据文件权限进行文件匹配。例如列出特定权限的所有文件:
find . -type f -perm 644
 
用-user 可以找到由某个特定用户所拥有的文件:
例如,打印出用户slynux拥有的所有文件:
find . -type f -user slynux
9.让find跳过特定的目录
在搜索目录并执行某些操作的时候,有时候为了提高性能,需要跳过一些子目录。
可以利用-prune选项参数。
例如,我要在查找在该目录下除了wwwroot目录之外的所有php文件:
find . \( -name "wwwroot" -prune \) -o \( -name "*.php" \)
这里的\( -name "wwwroot" -prune \)的作用是用于进行排除,而\( -name "*.php" \)
指明了需要进行的动作。这些动作需要被放置在第二个语句块中。
10.结合find执行命令或动作
find命令可以借助选项-exec与其他命令进行结合。
比如,我们需要将某一位用户全部文件的所有权更改成另一位用户,那么就可以用-user找出root的所有文件,然后用-exec更改所有权。
你必须是超级用户身份才能更改权限。
示例如下:
find . -type f -user root -exec chown slynux {} \;
这个命令中,{ }是一个特殊的字符串,与-exec选项结合使用。对于每一个匹配的文件,{ }会被替换成响应的文件名。
例如,find命令找到两个文件test1.txt和text2.txt,其所有者均为slynux,那么find将会执行:
chown slynux {}
它会解析为:chown slynux test1.txt 和 chown slynux test2.txt。
例如,用下面的命令将10前的.txt文件复制到old目录中
find . -type f -mtime +10 -name "*.txt" -exec cp {} old \;
find命令同样可以采用类似的方法与其他命令结合起来。
-exec结合多个命令
我们无法在-exec中直接使用更多个命令。它只能接受单个命令,不过我们可以吧多个命令写到一个shell文件中,然后在-exec中使用跟这个脚本:
-exec ./commands.sh {}\;

 

你可能感兴趣的:(find命令详解)