索引
- 在Windows的旧版本当中,想要搜索一个文件是非常缓慢的。为了实现快速查找,在Windows 10和Linux系统当中,系统会专门维护一个索引文件(以空间换时间)
- 在Linux当中,索引文件是存放在具体的磁盘文件前面的,索引文件里面存放了各个文件的位置信息和其他信息。有关使用索引来实现快速查找的详细算法将会在数据库阶段进行讲解
使用find命令可以根据查找条件来在起始目录之下来查找文件,然后再执行指定的操作
find 起始目录 查找条件 操作
使用find命令可以用来查找某个头文件的位置
sudo apt install gcc
#先安装gcc编译器
find /usr/include -name stdio.h
# 在/usr/include目录下面查找文件stdio.h
常见的查找条件
根据名称和文件属性查找
-name ’字串’
查找文件名匹配所给字串的所有文件,字串内可用通配符*
、?
、[ ]
-gid n
查找属于ID号为n的用户组的所有文件- 查看/etc/passwd查看userid和groupid
- 如果用户名比较长不方便写就用id查找
-uid n
查找属于ID号为n的用户的所有文件
find . -uid 1000
-group ’字串’
查找属于用户组名为所给字串的所有的文件-user ’字串’
查找属于用户名为所给字串的所有的文件
find . -user zw
# 这两个查找是等价的
-empty
查找大小为0的目录或文件。查找空目录、空文件-perm 权限
查找具有指定权限的文件和目录,权限的表示可以如711,644
-size n[bckw]
查找指定文件大小的文件,n后面的字符表示单位,缺省为b,代表512字节的块
find -size 1 #1表示大小为1个块的文件
find -size 6c #size为6bit的文件
find -size +1M #大于1Mbit的文件
find -size -1M #小于1Mb的文件,即小于等于0Mb,几个bit的搜不出来
-type x
查找类型为x的文件
根据时间查找
用于查看文件是否被别人篡改
自己目录不要给同组人设置写权限(改、写、删),最好自己弄一个版本系统不要依赖公司的系统
-amin n
查找n分钟以前被访问过的所有文件(+表示n分钟之前,-表示n分钟之内,+号和-号都不能省略) accessed-cmin n
查找n分钟以前文件状态被修改过的所有文件 changed
find -cmin -720 #查看12h内是否有人修改自己文件
-mmin n
查找n分钟以前文件内容被修改过的所有文件 modified-atime n
查找n天以前被访问过的所有文件-ctime n
查找n天以前文件状态被修改过的所有文件-mtime n
查找n天以前文件内容被修改过的所有文件- 其他的查找条件可以在man帮助里面找到
应用通配符
通配符是字符串里面的特殊符号。如果将字符串里面的通配符按照一定的规则用字符来替换以后,得到的字符串和目标字符串一致,那么目标字符串就能匹配例子,当前目录里面有文件file,file1,file12,file2,file3,file4
$ find . -name "file*"
# *用来匹配0至多个任意字符
$ find . -name "file?"
# ?用来匹配1个任意字符
$ find . -name "file[0-9]"
# [范围] 用来匹配1个范围内的字符
$ find . -name "file[135]"
# [范围] 用来匹配1个范围内的字符1或3或5
$ find . -name "file[abc1-5]"
# [范围] 用来匹配1个范围内的字符
查找条件的运算
查找条件可以进行逻辑运算,比如逻辑与,逻辑或和逻辑非
- 在命令中用
-a
表示逻辑与,表示只有当所给的条件都满足时,查找条件才满足。例如在/home/user目录下查找名为0718 类型是一个目录的文件(使用频率最高):
find /home/user –name 0718 –a -type d
- 在命令中用
-o
表示逻辑或,表示只要所给的条件有一个满足,查找条件就满足。例如在/home/user目录下查找名字为main.cc 或名字为 main.c的文件:
find /home/user -name main.cc -o -name main.c
- 在命令中用
!
表示逻辑非,表示查找不满足所给条件的文件。例如在/home/user下查找名字不是main.c的文件:
find /home/user ! –name main.c
find . ! -type d #查找所有文件不要目录文件
# 表示当前目录的.是必须要加上的
# 查找普通文件
find . -type f
只查找本层目录
$tree
.
├── file1
├── file2
├── newdir
│ └── file
└── newdir2
2 directories, 3 files
$find -maxdepth 1 -name "file*"
./file1
./file2
查找的权限
必须要拥有某个目录的读权限,才能够进入该目录进行查找
组合操作
在find命令后面添加-exec 新命令 \;
就可以对每个查找出来的文件执行新命令
find . -type f -exec ls -al {} \; #查看当前目录有哪些普通文件以及详细信息
-exec 将前面find命令执行的结果放在
{}
中执行ls -al
相当于循环,每次循环执行ls -al 命令
-exec 只对find生效,不是所有的命令都有-exec
管道 |
工作中一般使用xargs,通常可以使用|
将find命令的执行结果输出到一个缓冲区(而不是显示屏)里
面,这个缓冲区称为管道,(上一条命令的输出做下一条命令的输入)。然后xargs
可以从管道中按行读取内容,并且循环执行命令
find . -type f | xargs ls -l
如果对于管道里面的内容,不需要按行循环执行命令,那么就不需要使用xargs,直接使用管道即可
ls|wc -l
# 列出所有文件然后统计行数