【Linux】(8)shell脚本-常见目录-命令的查找(whereis、locate、which、find)

目录

一、知识补充

        1.1 可执行文件

        1.2 shell脚本

        1.2.1 接受用户输入

        1.2 关于PATH变量

        1.3 常见目录的作用

二、命令的查找

        2.1 whereis

        2.2 locate

        2.2.1 查找的概念

        2.2.2 mlocate.db

        2.3 【总结】which、whereis、locate的区别

        2.4 🔴find

        2.4.1 常用查找条件

        2.4.2 多条件查找

        2.4.3 常用动作

        2.4.4 练习


一、知识补充

        1.1 可执行文件

  1. c语言编译出来的二进制文件
  2. python文件,授予可执行权限 chmod +x 文件名
  3. shell脚本文件,授予可执行权限 chmod +x 文件名

        1.2 shell脚本

[root@localhost ~]# vim lihua.sh
[root@localhost ~]# cat lihua.sh
#!/bin/bash

echo "hello, lihua"
echo "I am lihua."
echo "I am learning linux"
[root@localhost ~]# bash lihua.sh  #执行shell脚本
hello, lihua
I am lihua.
I am learning linux
[root@localhost ~]# vim lihua.sh
[root@localhost ~]# cat lihua.sh
#!/bin/bash

read -p "please input your name:" name
read -p "please input your passwd:" passwd
echo "hello, lihua"
echo "I am lihua."
echo "I am learning linux"
echo "My name is $name, my passwd is $passwd"
[root@localhost ~]# bash lihua.sh
please input your name:lihua
please input your passwd:123
hello, lihua
I am lihua.
I am learning linux
My name is lihua, my passwd is 123
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1241 12月 15 19:07 anaconda-ks.cfg
drwxr-xr-x. 3 root root   60 2月  16 18:24 lianxi
-rw-r--r--. 1 root root    0 2月   6 20:37 lihua
-rw-r--r--. 1 root root  207 2月  20 15:28 lihua.sh
[root@localhost ~]# ./lihua.sh
-bash: ./lihua.sh: 权限不够  #没有可执行权限
[root@localhost ~]# chmod +x lihua.sh  #给lihua.sh授予可执行权限
[root@localhost ~]# ./lihua.sh
please input your name:lihua
please input your passwd:12
hello, lihua
I am lihua.
I am learning linux
My name is lihua, my passwd is 12


        1.2.1 接受用户输入

read 是shell编程里接受用户输入的命令 ==>相当于python里的input函数

-p "请输入用户名:" -p后面接提示用户的字符串 prompt 提示

name 变量名,用来存储用户输入的内容

[root@localhost ~]# read -p "请输入用户名:" name
请输入用户名:lihua
[root@localhost ~]# echo $name
lihua

        1.2 关于PATH变量

如果要让Linux系统找到我们自己编译安装的软件,就要去修改PATH变量,或者将程序放到PATH变量里面。

        1.3 常见目录的作用

/user 是Linux存放系统资料的目录 相当于Windows里的program file 文件夹(unix system resource)

/home 普通用户的家目录

/root root用户的家目录

/bin 存放二进制文件

/var 存放库文件

/dev 是存放设备文件的目录。Linux里每一个硬件会有一个文件和它对应,例如:鼠标、键盘、显示器等设备

二、命令的查找

        2.1 whereis

查找文件的路径和该文件的帮助文件路径。原理和which相似

/user 是Linux存放系统资料的目录 相当于Windows里的program file 文件夹(unix system resource)

/home 普通用户的家目录

/root root用户的家目录

/bin 存放二进制文件

/var 存放库文件

[root@localhost lianxi]# whereis mkdir
mkdir: /usr/bin/mkdir /usr/share/man/man1/mkdir.1.gz
[root@localhost lianxi]# which mkdir
/usr/bin/mkdir

        2.2 locate

yum provides locate 查找locate命令的软件包

yum remove mlocate -y 删除软件包

locate命令是到/var/lib/mlocate/mlocate.db数据库文件里查找信息的

[root@localhost lianxi]# locate mkdir
locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录

要手动更新mlocate.db。Linux系统会每天自动执行updatedb命令,更新locate命令查找的数据库

locate mkdir 会把文件名里含有mkdir的文件都查找处来,只要在Linux系统的根目录下


[root@localhost mlocate]# updatedb  更新db
[root@localhost mlocate]# ls
mlocate.db
[root@localhost mlocate]# locate mkdir
/usr/bin/mkdir
/usr/lib/python3.6/site-packages/pip/_vendor/lockfile/mkdirlockfile.py
/usr/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.opt-1.pyc
/usr/lib/python3.6/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-36.pyc
/usr/share/man/man1/mkdir.1.gz
/var/cache/man/cat1/mkdir.1.gz
[root@localhost mlocate]#

        2.2.1 查找的概念

  1. 精确查找 ==》which
  2. 模糊查找 ==》locate

        2.2.2 mlocate.db

mlocate.db 是locate专用数据库,其他命令不使用

文件里是根据当前Linux系统里所有的文件和文件夹建立了一个索引

索引:相当于书本的目录,便于查询。索引是用来快速查询的一种特殊数据,它描述了其他数据存放在哪里。

        2.3 【总结】which、whereis、locate的区别

1. which和whereis是查找Linux命令的工具,只能到PATH变量定义的路径下查找。

只能找到命令,只到PATH变量目录下查找。

2. locate是从整个Linux系统里找,能查找文件和命令,但是有缺点是查找新的文件,有时候找不到,需要更新数据库。

能找文件和命令,模糊查找,到mlocate.db里查找。

优点:查找速度特别快,因为是到数据库里查找

3. find 可以查找文件和命令,可以模糊和精确查找,查找的范围是整个Linux系统

        2.4 🔴find

用途:用于查找文件或目录

格式:find [查找范围] [查找条件][动作]

[root@localhost lianxi]# find / -name lx_hello.c
/root/lianxi/cmd/lx_hello.c

/ 查找的位置

-name 条件:名字

lx_hello.c 具体的名字

默认是精确查找,若是想要模糊查找,可以利用通配符。如:要查找含有hello的文件,"*hello*" 为避免出现语法检测问题,尽量用双引号引起来。

        为什么查找范围喜欢用/ ?

答:因为所有的文件直接或间接的都在根目录下,肯定能被找到。

        2.4.1 常用查找条件

  • -name:按文件名称查找
  • -iname:按文件名称查找,不区分大小写
[root@localhost lianxi]# find . -iname "*lihua*"
./cmd/lihua.txt
./LIHUA.txt

        为什么会这样:find: ‘/proc/2925/task/2925/fd/6’: 没有那个文件或目录

答:proc表示进程,有时候进程产生了文件,随后又消失了,所以就会无法找到。

        如何让这类消息不输出呢?

答:[root@localhost lianxi]# find / -size +10M 2>/dev/null

        理由:> 正确的输出重定向 >> 正确的追加输出重定向。2> 错误的输出重定向 2>> 错误的追加重定向

        /dev 是存放设备文件的目录。Linux里每一个硬件会有一个文件和它对应,例如:鼠标、键盘、显示器等设备

        null 是一个Linux里的黑洞文件,任何内容放到这个文件里都会消失

有的内容我们不想看到也不想保存就会重定向到/dev/null

[root@localhost lianxi]# find / -size +100M
/proc/kcore
find: ‘/proc/3314/task/3314/fd/6’: 没有那个文件或目录
find: ‘/proc/3314/task/3314/fdinfo/6’: 没有那个文件或目录
find: ‘/proc/3314/fd/5’: 没有那个文件或目录
find: ‘/proc/3314/fdinfo/5’: 没有那个文件或目录
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/usr/lib/locale/locale-archive
[root@localhost lianxi]# find / -size +100M 2>/dev/null
/proc/kcore
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/usr/lib/locale/locale-archive

  • -size:按文件大小查找

find / -size +10M 大于10M

find / -size -10M 小于10M

find / -size 10M 等于10M

+k +1M +1G(k为小写)

  • -user:按文件属主查找
  • -type:按文件类型查找
[root@localhost cmd]# find . -type f
./lx_hello.c
./lx_hello
./lihua.txt
  • -maxdepth:查找文件的时候,目录的深度

1 代表当前

2 代表下一级目录

3 下一级的下一级目录,以此类推

[root@localhost cmd]# mkdir aa/bb/cc/dd -p
[root@localhost cmd]# ls
aa  lx_hello  lx_hello.c
[root@localhost cmd]# cp lx_hello.c aa
[root@localhost cmd]# cp lx_hello.c aa/bb
[root@localhost cmd]# cp lx_hello.c aa/bb/cc
[root@localhost cmd]# cp lx_hello.c aa/bb/cc/dd
[root@localhost cmd]# tree aa
aa
├── bb
│   ├── cc
│   │   ├── dd
│   │   │   └── lx_hello.c
│   │   └── lx_hello.c
│   └── lx_hello.c
└── lx_hello.c
[root@localhost cmd]# find . -name lx_hello.c
./lx_hello.c
./aa/bb/cc/dd/lx_hello.c
./aa/bb/cc/lx_hello.c
./aa/bb/lx_hello.c
./aa/lx_hello.c
[root@localhost cmd]# find . -maxdepth 1 -name lx_hello.c
./lx_hello.c
[root@localhost cmd]# find . -maxdepth 2 -name lx_hello.c
./lx_hello.c
./aa/lx_hello.c
[root@localhost cmd]# find . -maxdepth 3 -name lx_hello.c
./lx_hello.c
./aa/bb/lx_hello.c
./aa/lx_hello.c

【注】-maxdepth 必须要放到前面

[root@localhost cmd]# find . -name lx_hello.c -maxdepth 1
find: 警告: 您在非选项参数 -name 后定义了 -maxdepth 选项,但选项不是位置选项 (-maxdepth 影响在它之前或之后的指定的比较测试)。请在其它参数之前指定选项。

./lx_hello.c
  • -newer:查找创建时间更靠后/更新的文件
[root@localhost lianxi]# find . -newer cali.txt

Linux里的文件类型

f 类型为文件 file

d 类型为文件夹(目录)directory

l 类型为链接文件 link

b 类型为块设备文件 block

c 类型为字符设备文件 character

p 类型为管道文件 pipe

s 类型为socket文件

  • -perm:按文件权限查找
  • -mtime:按文件更改时间查找(以24小时为单位)File's data was last modified n*24 hours ago

+4 四天前

-4 四天内

【补充】-mmin (以分钟为单位) 用法:find . -mmin -20 查找20分钟以内的

[root@localhost ~]# find . -mtime -4  #查找4天内更改过的文件和文件夹等
.
./.bash_history
./lianxi
./lianxi/cmd
./lianxi/cmd/lihua.txt
./lianxi/LIHUA.txt
./.viminfo
  • -never:按比某个文件更新的查找

        2.4.2 多条件查找

        1. and(-a) 并且,两个条件都要满足【默认是and】

find /boot -size -3M and -name "*hello*"

        2. or(-o) 或者,满足其中一个条件

find /boot -size -3M or -name "*hello*"

        3. -not(-!) 非,不满足条件。放在选项前,只对最近的一个选项有用

优先级:-a > -0


[root@localhost lianxi]# find /boot -size -3M -name "*hello*"
/boot/grub2/i386-pc/hello.mod

        2.4.3 常用动作

  • 🔴-exec将find查找的结果交给-exec后面的命令执行
[root@localhost backup]# find / -name lx_hello.c -type f -exec cp {} /root/lianxi/backup \;
cp: "/root/lianxi/backup/lx_hello.c" 与"/root/lianxi/backup/lx_hello.c" 为同一文件

        find / -name lx_hello.c -type f 到根目录下查找名字是lx_hello.c的文件

        -exec 需要执行后面的命令 execute

        cp {} /root/lianxi/backup 执行cp命令

        {} 代表前面find找到的内容,相当于一个容器,存放find找到的内容

        /root/lianxi/backup cp命令的目的地

        \; find命令的结束符号

        cp: "/root/lianxi/backup/lx_hello.c" 与"/root/lianxi/backup/lx_hello.c" 为同一文件 正常返回,因为我们是从根目录下找到的文件,且所有的文件都直接或间接保存在根目录中,所以复制过去之后也相当于是复制到了根目录下。

  • -ok:比-exec动作多了一个确认

        2.4.4 练习

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值