没有所谓的捷径
一切都是时间最平凡的累积

Linux find 命令详解

本文最后更新:2021年12月6日,已超过1081天未更新,如果文章内容失效,请留言反馈本站。

Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

1)path:要查找的目录路径。

~ 表示$HOME目录
. 表示当前目录
/ 表示根目录
2)print:表示将结果输出到标准输出。

3)exec:对匹配的文件执行该参数所给出的shell命令。
形式为command {} \;,注意{}与\;之间有空格

4)ok:与exec作用相同,
区别在于,在执行命令之前,都会给出提示,让用户确认是否执行

5)|xargs 与exec作用相同 ,起承接作用

区别在于 |xargs 主要用于承接删除操作 ,而 -exec 都可用 如复制、移动、重命名等

6)options :表示查找方式

options常用参数选项:
-name filename #查找名为filename的文件
-iname name : 文件名称符合 name 的文件。iname 忽略大小写
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-amin n : 在过去 n 分钟内被读取过
-cmin n : 在过去 n 分钟内被修改过
-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
-anewer file : 比文件 file 更晚被读取过的文件
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-cnewer file :比文件 file 更新的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-prune #忽略某个目录

你可以使用 ( ) 将运算式分隔,并使用下列运算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2

实例

将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:

# find . -name "*.c"

将当前目录及其子目录中的所有文件列出:

# find . -type f

将当前目录及其子目录下所有最近 20 天内更新过的文件列出:

# find . -ctime -20

查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:

# find /var/log -type f -mtime +7 -ok rm {} \;

查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:

# find . -type f -perm 644 -exec ls -l {} \;

查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径:

# find / -type f -size 0 -exec ls -l {} \;

1、按名字查找

在当前目录及子目录中,查找大写字母开头的txt文件
$ find . -name '[A-Z]*.txt' -print

在/etc及其子目录中,查找host开头的文件
$ find /etc -name 'host*' -print

在$HOME目录及其子目录中,查找所有文件
$ find ~ -name '*' -print

2、按目录查找

在当前目录及子目录中,查找不是out开头的txt文件
$ find . -name "out*" -prune -o -name "*.txt" -print

在当前目录除aa之外的子目录内搜索 txt文件
$ find . -path "./aa" -prune -o -name "*.txt" -print

在当前目录及除aa和bb之外的子目录中查找txt文件
$ find . −path′./dir0′−o−path′./dir1′−path′./dir0′−o−path′./dir1′ -a -prune -o -name '*.txt' -print

在当前目录,不再子目录中,查找txt文件
$ find . ! -name "." -type d -prune -o -type f -name "*.txt" -print
或者
find . -name *.txt -type f -print

3、按权限查找

在当前目录及子目录中,查找属主具有读写执行,其他具有读执行权限的文件
$ find . -perm 755 -print

查找用户有写权限或者组用户有写权限的文件或目录
find ./ -perm /220
find ./ -perm /u+w,g+w
find ./ -perm /u=w,g=w

4、按类型查找  (b/d/c/p/l/f )

在当前目录及子目录下,查找符号链接文件
$ find . -type l -print

5、按属主及属组

查找属主是www的文件
$ find / -user www -type f -print

查找属主被删除的文件
$ find / -nouser -type f -print

查找属组 mysql 的文件
$ find / -group mysql -type f -print

查找用户组被删掉的文件
$ find / -nogroup -type f -print

6、按时间查找

查找2天内被更改过的文件
$ find . -mtime -2 -type f -print

查找2天前被更改过的文件
$ find . -mtime +2 -type f -print

查找具体某一天被修改过的文件,示例是2天以前4天以内,所以是查找三天前这一天的数据
$ find . -mtime +2 -mtime -4 -type f -print
或者用
$ find . -mtime 3 -type f -print

查找一天内被访问的文件
$ find . -atime -1 -type f -print

查找一天前被访问的文件
$ find . -atime +1 -type f -print

查找一天内状态被改变的文件
$ find . -ctime -1 -type f -print

查找一天前状态被改变的文件
$ find . -ctime +1 -type f -print

查找10分钟以前状态被改变的文件
$ find . -cmin +10 -type f -print

7、按文件新旧

查找比 aa.txt 新的文件
$ find . -newer "aa.txt" -type f -print

查找比 aa.txt 旧的文件
$ find . ! -newer "aa.txt" -type f -print

查找比aa.txt新,比bb.txt旧的文件
$ find . -newer 'aa.txt' ! -newer 'bb.txt' -type f -print

8、按大小查找

查找超过1M的文件
$ find / -size +1M -type f -print

查找小于10K的txt文件
$ find /home/ -type f -size -10 -name "*.txt"

复制小于10k的文件到/www/wwwroot目录
$ find /home/ -type f -size -10 -name "*.txt"|xargs -i cp -rf {} /www/wwwroot

查找等于6字节的文件
$ find . -size 6c -print

查找小于32k的文件
$ find . -size -32k -print

9、执行命令

1)查找 del.txt 并删除,删除前提示确认
$ find . -name 'del.txt' -ok rm {} \;

2) 查找 aa.txt 并备份为aa.txt.bak
$ find . -name 'aa.txt' -exec cp {} {}.bak \;

3)查当前目录下的所有普通文件

# find . -type f -exec ls -l {} \;
-rw-r–r– 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r–r– 1 root root 12959 2003-02-25 ./conf/magic
-rw-r–r– 1 root root 180 2003-02-25 ./conf.d/README

查当前目录下的所有普通文件,并在 - exec 选项中使用 ls -l 命令将它们列出

4)在 /logs 目录中查找更改时间在5日以前的文件并删除它们
$ find logs -type f -mtime +5 -exec -ok rm {} \;

5)查询当天修改过的文件
# find ./ -mtime -1 -type f -exec ls -l {} \;

6)查询文件并询问是否要显示

# find ./ -mtime -1 -type f -ok ls -l {} \;
< ls … ./classDB.inc.php > ? y
-rw-r–r– 1 cnscn cnscn 13709 1月 12 12:22 ./classDB.inc.php
# find ./ -mtime -1 -type f -ok ls -l {} \;
< ls … ./classDB.inc.php > ? n

» 站长码字辛苦,有用点个赞吧,也可以打个
» 若转载请保留本文转自:豫章小站 » 《Linux find 命令详解》
» 本文链接地址:https://blog.mydns.vip/4145.html
» 如果喜欢可以: 点此订阅本站 有需要帮助,可以联系小站
赞(1) 打赏
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除,联系邮箱:contact@mydns.vip。文章观点不代表本站立场。本站原创内容未经允许不得转载,或转载时需注明出处:豫章小站 » Linux find 命令详解
分享到: 更多 (0)

评论 抢沙发


  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

智慧源于勤奋,伟大出自平凡

没有所谓的捷径,一切都是时间最平凡的累积,今天所做的努力都是在为明天积蓄力量

联系我们赞助我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏