- 前言
- which命令
- whereis命令
- locate和updatedb命令
- find命令
- 与时间有关的参数
- 与使用者或组名有关的参数
- 与文件权限及名称有关的参数
- 额外的动作选项
- 总结
前几篇博客算是初步总结完成了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命令查找文件是通过系统中自己构建的数据库来进行搜寻。也不是直接去硬盘上搜索文件。
相关实例
##搜寻我们自己的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中文件查找的几个命令。



