目录
2.3 【总结】which、whereis、locate的区别
一、知识补充
1.1 可执行文件
- c语言编译出来的二进制文件
- python文件,授予可执行权限 chmod +x 文件名
- 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 查找的概念
- 精确查找 ==》which
- 模糊查找 ==》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动作多了一个确认