IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux基础学习笔记(七)——文件的查找 -> 正文阅读

[系统运维]Linux基础学习笔记(七)——文件的查找

前言

前几篇博客算是初步总结完成了Linux中文件权限的学习,这篇开始学习一下Linux中偏数据处理的一些命令,文件查找开始。依旧参考《鸟哥的Linux私房菜》

关于指令与文件的搜寻,指的是如何在Linux中查找文件,这个对应于《鸟哥的Linux私房菜》第六章第5节的相关内容,这里做一些总结和梳理。

which命令

在这里插入图片描述
which命令可以查找指定的指令在哪儿。

##查找ip指令的执行文件地址
[root@localhost ~]# which ip
/usr/sbin/ip
##查找ifconfig这个命令的执行文件在哪儿
[root@localhost ~]# which ifconfig
/usr/sbin/ifconfig
##查找我们安装的redis-cli命令的地址
[root@localhost ~]# which redis-cli
/usr/local/bin/redis-cli

但是,which命令,是根据系统变量PATH指定的路径进行文件查找。也就是说which命令只能查找PATH指定的路径,其他文件夹下的文件,which无法查找,同时which还无法查找bash的内部指令。比如history命令,这个which命令就无法查找

# 用which查找history,提示在PATH指定的路径下没有这个命令的执行文件
[root@localhost ~]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

总的来说which的查找范围有限

whereis命令

whereis命令用于查找某些特定目录(这些特定目录通过命令选项进行指定)下的文件。
在这里插入图片描述
这个命令也没有全系统去搜寻文件,主要是针对/bin/sbin目录下的文件和/usr/share/man下的man page文件,以及其他几个特定的目录进行查询,其查询速度还是比较快的。

locate和updatedb命令

locate命令查找文件是通过系统中自己构建的数据库来进行搜寻。也不是直接去硬盘上搜索文件。
在这里插入图片描述

相关实例

##搜寻我们自己的redis.conf文件 默认显示出全部
[root@localhost ~]# locate redis.conf
/usr/local/redis/redis.conf
/usr/local/software/redis-7.0.0/redis.conf
##搜寻出redis.conf中的个数
[root@localhost ~]# locate -c redis.conf
2
## -l(limit) 类似SQL中的limit,只查出优先的记录
[root@localhost ~]# locate -l 1 redis.conf
/usr/local/redis/redis.conf
## -S 显示出当前系统中,locate对应的数据库信息
[root@localhost ~]# locate -S
Database /var/lib/mlocate/mlocate.db:
	14,753 directories ## 总记录目录数
	167,493 files	##总记录文件数
	8,504,861 bytes in file names
	3,835,429 bytes used to store database

locate对应的数据库,位于/var/lib/mlocate,主要是从里面的数据进行搜寻。所以locate也不是直接从硬盘中去搜寻文件,因此对当前用户新建的文件,无法通过locate进行查找。如果想要当前用户的文件及时被系统搜寻到,可以通过updatedb去更新/var/lib/mlocate内的数据库文件。

find命令

find命令是很强大的,但时间花费很大,因为它是直接搜寻硬盘,如果硬盘接口速率较慢,则很影响效率。

find命令的基本格式如下,但是关于find命令的选项有点多,这里先从时间相关的选项来进行梳理。

与时间有关的参数

在这里插入图片描述
与时间有关的命令选项,在linux的命令中是一个比较常见的内容,这里做一个总结

时间命令中的正负数表示相关的时间范围,一张图可以较好的表示时间参数中正负数的含义
在这里插入图片描述

-atime指的是访问时间(access time)指的是文件最后被读取的时间

-atime<24小时数> 查找在指定时间曾被存取过的文件或目录,单位以24小时计算。

#  例如:当前时间为2022年5月18日 14:10:00,查询2022年5月18日00:00:查询2022年5月18日23:59:59被访问过的文件。
# time表示日期,时间单位是day,查找单位时间内的不带符号,当前无往前偏移,因此查询语句为
find . -atime 0
# 列出在最近1天之内被访问的文件
find . -atime -1
# 列出在1天前访问的文件
find . -atime 1

ctime:变更时间(change time),指的是**文件本身(权限、所属组、位置…)**最后被变更的时间,变更动作可以使chmod、chgrp、mv等等;

-ctime<24小时数> 查找在指定时间之时被更改的文件或目录,单位以24小时计算。

 # 例如:当前时间为2022年5月18日 14:10:00,查询2022年5月18日00:00:查询2022年5月18日23:59:59被修改过的文件。查询语句为:
find . -ctime 0

mtime:修改时间(modify time),指的是文件****内容最后被修改的时间,修改动作可以使echo重定向、vi等等;

-mtime<24小时数> 查找在指定时间曾被更改过的文件或目录,单位以24小时计算。

# 例如:当前时间为2022年5月18日 14:10:00,查询2022年5月18日00:00:00到2022年5月18日23:59:59内容被修改过的文件。查询语句为:
find . -mtime 0

与使用者或组名有关的参数

在这里插入图片描述

相关实例

# 查询/home目录下 属于用户thomas的文件
## 这个命令很有用的,当我们要找出任何一个用户在系统当中的所有文件时,可以用这个命令
[root@localhost etc]# find /home -user thomas
/home/coderman/coderman.txt
/home/thomas
/home/thomas/.mozilla
/home/thomas/.mozilla/extensions
/home/thomas/.mozilla/plugins
/home/thomas/.bash_logout
/home/thomas/.bash_profile
/home/thomas/.bashrc
/home/thomas/.cache
/home/thomas/.cache/abrt
/home/thomas/.cache/abrt/lastnotification
/home/thomas/.config
/home/thomas/.config/abrt
/home/thomas/.bash_history
/home/thomas/.viminfo
## 通过如下指令,可以轻易的找出不太正常的文件,这些文件不属于任何用户
## 查找系统中不属于任何用户的文件,通常我们之前创建的用户,用户在被删除之后
## 一些文件就成为了无用的文件,通过这个命令可以找出这类文件。
[root@localhost etc]# find / -nouser
/var/spool/mail/jack
/var/spool/mail/temp
/home/jack
/home/jack/.mozilla
/home/jack/.mozilla/extensions
/home/jack/.mozilla/plugins
/home/jack/.bash_logout
/home/jack/.bash_profile
/home/jack/.bashrc
/home/temp/.mozilla
/home/temp/.mozilla/extensions
## ...... 后面省略部分

与文件权限及名称有关的参数

在这里插入图片描述
在这里插入图片描述

-name是比较常用的一个选项,find命令根据文件名来搜寻文件,支持正则表达式的匹配。

相关实例:

## 查找根目录下 passwd 名字的文件。-name后面的表达式可以是正则
## find / -name '*passwd*'
[root@localhost etc]# find / -name passwd
/sys/fs/selinux/class/passwd
/sys/fs/selinux/class/passwd/perms/passwd
/etc/pam.d/passwd
/etc/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
# 搜寻大于50M的文件
[root@localhost etc]# find / -size +50M
/boot/initramfs-0-rescue-f0971428ddf7ca46a03278eaed9903e0.img
/proc/kcore
/var/lib/rpm/Packages
/var/cache/yum/x86_64/7/updates/gen/primary_db.sqlite
/var/cache/yum/x86_64/7/updates/gen/filelists_db.sqlite
/var/cache/yum/x86_64/7/updates/packages/kernel-3.10.0-1160.62.1.el7.x86_64.rpm
/var/cache/yum/x86_64/7/updates/packages/firefox-91.8.0-1.el7.centos.x86_64.rpm
/var/cache/yum/x86_64/7/updates/packages/firefox-91.9.0-1.el7.centos.x86_64.rpm
/var/cache/yum/x86_64/7/updates/packages/linux-firmware-20200421-80.git78c0348.el7_9.noarch.rpm
/var/cache/yum/x86_64/7/updates/packages/kernel-3.10.0-1160.66.1.el7.x86_64.rpm
/var/cache/yum/x86_64/7/updates/packages/firefox-91.9.1-1.el7.centos.x86_64.rpm
/usr/lib/locale/locale-archive
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/rt.jar
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64/jre/lib/rt.jar
/usr/lib64/firefox/libxul.so
/home/coderman/share/sogoupinyin-3.4.0.9700-2.x86_64.rpm
/home/coderman/share/sogoupinyin_3.4.0.9700_amd64.deb
# 查找/run目录下的所有类型为socket的文件
[root@localhost etc]# find /run -type s
/run/abrt/abrt.socket
/run/gssproxy.sock
/run/avahi-daemon/socket
/run/rpcbind.sock
/run/libvirt/libvirt-admin-sock
/run/libvirt/libvirt-sock-ro
/run/libvirt/libvirt-sock
/run/libvirt/virtlockd-sock
/run/libvirt/virtlogd-sock
/run/dbus/system_bus_socket
/run/lsm/ipc/simc
/run/lsm/ipc/sim
/run/user/1000/pulse/native
find: ‘/run/user/1000/gvfs’: Permission denied
/run/user/1000/keyring/ssh
/run/user/1000/keyring/pkcs11
/run/user/1000/keyring/control
/run/cups/cups.sock
/run/lvm/lvmetad.socket
/run/lvm/lvmpolld.socket
/run/udev/control
/run/systemd/shutdownd
/run/systemd/private
/run/systemd/journal/socket
/run/systemd/journal/stdout
/run/systemd/cgroups-agent
/run/systemd/notify
## 查找文件当中包含 SGID或SUID或SBIT的属性
## 这里的/7000 表示只要含有---s--s--t 就列出
## 如果用 -7000 表示同时含有---s--s--t的所有三个权限,而只需要任意一个,就是/7000
## 如果用7000, 表示文件权限刚好等于---s--s--t
[root@localhost etc]# find / -perm /7000
## 搜寻/usr/bin,/usr/sbin下的,只要有SUID和SGID的权限
[root@localhost etc]# find /usr/bin/ /usr/sbin/ -perm /6000
/usr/bin/fusermount
/usr/bin/wall
/usr/bin/ksu
/usr/bin/chfn
/usr/bin/passwd
/usr/bin/chsh
/usr/bin/staprun
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/su
/usr/bin/newgrp
/usr/bin/umount
/usr/bin/mount
/usr/bin/write
/usr/bin/pkexec
/usr/bin/crontab
/usr/bin/Xorg
/usr/bin/ssh-agent
/usr/bin/cgexec
/usr/bin/at
/usr/bin/cgclassify
/usr/bin/sudo
/usr/bin/locate
/usr/sbin/unix_chkpwd
/usr/sbin/pam_timestamp_check
/usr/sbin/netreport
/usr/sbin/usernetctl
/usr/sbin/lockdev
/usr/sbin/userhelper
/usr/sbin/mount.nfs
/usr/sbin/postdrop
/usr/sbin/postqueue

额外的动作选项

在这里插入图片描述

针对find查找的结果,通过上述参数,我们可以做一些自定义的处理,比如上面的实例,我们通过find命令查找出来,只显示了文件名,如果想要通过ll命令详细列出来,可以用到find的-exec选项

实例

## 将之前找到的文件,通过ls -l 命令列出来
[root@localhost etc]# find /usr/bin/ /usr/sbin/ -perm /7000 -exec ls -l {} \;
-rwsr-xr-x. 1 root root 32096 Oct 31  2018 /usr/bin/fusermount
-r-xr-sr-x. 1 root tty 15344 Jun 10  2014 /usr/bin/wall
-rwsr-xr-x. 1 root root 61320 Dec  2  2021 /usr/bin/ksu
-rws--x--x. 1 root root 23968 Oct  1  2020 /usr/bin/chfn
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /usr/bin/passwd
-rws--x--x. 1 root root 23880 Oct  1  2020 /usr/bin/chsh
---s--x---. 1 root stapusr 212080 Oct 14  2020 /usr/bin/staprun
-rwsr-xr-x. 1 root root 73888 Aug  9  2019 /usr/bin/chage
-rwsr-xr-x. 1 root root 78408 Aug  9  2019 /usr/bin/gpasswd
-rwsr-xr-x. 1 root root 32128 Oct  1  2020 /usr/bin/su
-rwsr-xr-x. 1 root root 41936 Aug  9  2019 /usr/bin/newgrp
-rwsr-xr-x. 1 root root 31984 Oct  1  2020 /usr/bin/umount
-rwsr-xr-x. 1 root root 44264 Oct  1  2020 /usr/bin/mount
-rwxr-sr-x. 1 root tty 19544 Oct  1  2020 /usr/bin/write
-rwsr-xr-x. 1 root root 23576 Apr  1  2020 /usr/bin/pkexec
-rwsr-xr-x. 1 root root 57656 Aug  9  2019 /usr/bin/crontab
-rwsr-xr-x. 1 root root 2447304 Apr  1  2020 /usr/bin/Xorg
---x--s--x. 1 root nobody 382216 Aug  9  2019 /usr/bin/ssh-agent
-rwxr-sr-x. 1 root cgred 15608 Aug  9  2019 /usr/bin/cgexec
-rwsr-xr-x. 1 root root 53048 Oct 31  2018 /usr/bin/at
-rwxr-sr-x. 1 root cgred 15632 Aug  9  2019 /usr/bin/cgclassify
---s--x--x. 1 root root 147336 Oct  1  2020 /usr/bin/sudo
-rwx--s--x. 1 root slocate 40520 Apr 11  2018 /usr/bin/locate
-rwsr-xr-x. 1 root root 36272 Apr  1  2020 /usr/sbin/unix_chkpwd
-rwsr-xr-x. 1 root root 11232 Apr  1  2020 /usr/sbin/pam_timestamp_check
-rwxr-sr-x. 1 root root 11224 Oct 13  2020 /usr/sbin/netreport
-rwsr-xr-x. 1 root root 11296 Oct 13  2020 /usr/sbin/usernetctl
-rwx--s--x. 1 root lock 11208 Jun 10  2014 /usr/sbin/lockdev
-rws--x--x. 1 root root 40328 Aug  9  2019 /usr/sbin/userhelper
-rwsr-xr-x. 1 root root 117432 Oct  1  2020 /usr/sbin/mount.nfs
-rwxr-sr-x. 1 root postdrop 218560 Apr  1  2020 /usr/sbin/postdrop
-rwxr-sr-x. 1 root postdrop 264128 Apr  1  2020 /usr/sbin/postqueue

这里用到的exec的相关解释如下
在这里插入图片描述
其中的{}表示的是find找到的内容,find的结果会放到{}位置中。
-exec一直到 \;是关键词,代表find额外动作的开始(-exec)到结束(;),这中间的就是find命令内的额外动作,这里是ls -l {}最后的;在bash环境下是有特殊意义的,因此需要通过反斜杠进行转义

总结

简单总结了Linux中文件查找的几个命令。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-06-16 21:53:05  更:2022-06-16 21:53:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 2:06:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码