Shell 编程(三):Shell 编程中的常用工具
- 陈大剩
- 2023-01-27 22:25:41
- 1047
文件查找
命令比较
命令 | 使用场景 | 优缺点 |
---|---|---|
find | 查找某一类文件,比如文件名部分一致 | 功能强大,速度慢 |
locate | 只能查找单个文件 | 功能单一,速度快 |
whereis | 查找程序的可执行文件、帮助文档等 | 不常用 |
which | 只查找程序的可执行文件 | 常用于查找程序的绝对路径 |
Locate命令
Locate可以让用户快速查找到所需要的文件或目录,它不会搜索全部数据信息,而是搜索数据库 /var/lib/mlocate/mlocate.db。此数据库是本地系统内所有文件名称及路径。系统会自动创建这个数据库,并且每天更新一次。
安装
遇到错误“locate: 未找到命令”先安装
yum install mlocate -y
更新后台数据库(缓存)
updatedb
运行“locate inittab”查看是否成功
[root@localhost /]# locate inittab /etc/inittab /usr/share/vim/vim74/syntax/inittab.vim
命令格式
命令格式
locate [参数] [文件]
参数 作用 -e 将排除在寻找的范围之外。 -1 如果是1.则启动安全模式。在安全模式下,使用者只能看到权限范围内的档案。这会使速度减慢,因为locate必须从实际的档案系统中取得档案的权限资料。 -f 将特定的档案系统排除在外,例如我们没有道理要把proc档案系统中的档案放在资料库中。 -q 安静模式,不会显示任何错误讯息。 -n 最多显示n个输出。 -r 使用正规运算式做寻找的条件。 -o 指定资料库的名称。 -d 指定资料库的路径 -h 显示辅助讯息 -V 显示程式的版本讯息 -i 忽略大小写 -c 只输出找到的数量 用户更新 /var/lib/mlocate/mlocate.db,所使用配置文件 /etc/updatedb.conf 【不想搜索的文件可以写入到 updatedb.conf 中】
使用示例
查找和crontab相关的所有文件并且只展示一个
[root@localhost /]# locate crontab -n 1 /etc/anacrontab
locate 与 find 不同: find 是去硬盘找,locate 只在 /var/lib/slocate 资料库中找。
Find 命令
Find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
命令格式
find [路径] [选项] [操作]
选项
选项 含义 -name 根据文件名查找 -perm 根据文件权限查找 -prune 该选项可以排除某些查找目录
-path xxx -prune -o -path xxx -prune -o
-user 根据文件属主查找 -group 根据文件属组查找 -mtime -n | +n 根据文件更改时间查找 -nogroup 查找无有效属组的文件 -nouser 查找无有效属主的文件 -newer file1 ! file2 查找更改时间比 file1 新但比 file2 旧 IDE 文件 -type 按文件类型查找
f:文件;d:目录;c:字符设备文件;b:块设备文件;l:链接文件;p:管道文件;-size -n +n 按文件大小查找 -mindepth n 从n级子目录开始搜索 -maxdepth n 最多搜索到n级子目录 操作
操作 含义 -print 打印输出(默认) -exec 对搜索到的文件执行特定的操作
-exec 'command' {} \;
-ok 和 exec 功能-样,只是每次操作都会给用户提示 使用示例
1).查找ifcfg-ens33网卡文件
[root@localhost ~]# find / -name "ifcfg-ens33" /etc/sysconfig/network-scripts/ifcfg-ens33
2).在/etc、/usr、/home 目录下搜索ifcfg-ens33(其中*为通配符)
[root@localhost /]# find /etc /usr /home -name "ifcfg-en*" /etc/sysconfig/network-scripts/ifcfg-ens33
3).根据时间查找(atime、mtime、ctime)查找大于、等于、小于 5天的文件
# 小于5天(-5) 大于5天(+5) 等于 5天 (5) [root@localhost /]# find /etc/ -mtime -5 /etc/ /etc/resolv.conf /etc/rc.d/init.d/bt /etc/group /etc/gshadow /etc/pki/nssdb /etc/sysconfig/network-scripts /etc/cron.daily /etc/tuned/active_profile /etc/tuned/profile_mode
4).在/etc下的3级子目录开始搜索
[root@localhost /]# find /etc -mindepth 3 /etc/rdma/modules/roce.conf /etc/rdma/modules/opa.conf ... /etc/nftables/osf/pf.os
5).查找当前目录下所有普通文件,但排除test目录
[root@localhost /]# find . -path ./test -prune -o -type f
6).搜索 /etc 下的文件(非目录),文件名以 conf 结尾,且大于 10k,然后将其删除|
[root@localhost /]# cp -r /etc /home/etc [root@localhost /]# find /home/etc/ -type f -name '*.conf' -size +10k -exec rm -rf {} \ [root@localhost /]# find /home/etc/ -type f -name '*.conf' -size +5k -ok rm -rf {} \; < rm ... /home/etc/man_db.conf > ? y < rm ... /home/etc/kdump.conf > ? n < rm ... /home/etc/tcsd.conf > ? n
使用Find命令时尽量在指定目录下进行搜索,否则会占用很多系统资源
Which命令
which命令用于查找文件。
which指令会在环境变量
$PATH
设置的目录里查找符合条件的文件。且可查找存在以及执行位置echo 命令可以查看$PATH的值
[root@localhost /]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
which会根据上面7个文件返回
命令格式
which [文件...]
为什么which后面是文件?因为Linux一起皆为文件,执行文件也是文件
参数 作用 -n<文件名长度> 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。 -p<文件名长度> 与-n参数相同,但此处的<文件名长度>包括了文件的路径。 -w 指定输出时栏位的宽度。 -V 显示版本信息。 使用示例
查找“find”的绝对路径
[root@localhost /]# which find /usr/bin/find
查看指令”bash”的绝对路径
[root@localhost /]# which bash /usr/bin/bash
值得注意的是which查找文件会根据/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 这七个目录进行查找,优先查找到后返回。
Whereis 命令
在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。该指令只能用于查找二进制文件、源代码文件和man手册页。
命令格式
whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]
|参数 | 作用|
| —|—|
|-b | 只查找二进制文件。|
| -B<目录> | 只在设置的目录下查找二进制文件。|
|-f | 不显示文件名前的路径名称。|
|-m | 只查找说明文件。|
|-M<目录> | 只在设置的目录下查找说明文件。|
|-s | 只查找原始代码文件。|
|-S<目录> | 只在设置的目录下查找原始代码文件。|
|-u | 查找不包含指定类型的文件。|
#### 使用示例
查看"bash"的位置
```
[root@localhost /]# whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz
# 只查找二进制文件
[root@localhost /]# whereis -b bash
bash: /usr/bin/bash
# 只查找说明文件
[root@localhost /]# whereis -m bash
bash: /usr/share/man/man1/bash.1.gz
```
压缩
Linux 系统支持的打包压缩命令有很多种,不同命令所用的压缩技术不同,彼此无法相互压缩。压缩文件的名称会添加后缀。如.gz、.bz2、.tar.xz、.tar.gz
gizp
[root@localhost home]# touch /home/root/file{1..20}
[root@localhost home]# gizp /home/root/*
[root@localhost home]# ls /home/root/
file10.gz file11.gz file12.gz file13.gz file14.gz file15.gz file16.gz file17.gz file18.gz file19.gz file1.gz file20.gz file2.gz file3.gz file4.gz file5.gz file6.gz file7.gz file8.gz file9.gz
gzip 命令只能对单一的文件进行压缩,并不能将多个文件打包为一个大文件
tar
tar(英文全拼:tape archive )命令用于备份文件。
tar 是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。
tar 命令可将多个目录与文件打包在一起,同时还可以使用gzip命令对文件进行压缩。
命令格式
格式太长不一一介绍把常用的参数介绍一下
参数 | 作用 |
---|---|
-c | 打包一个文件 |
-z | 调用gzip进行压缩 |
-j | 调用bzip2进行压缩 |
-J | 调用xz进行压缩 |
-f | 表示后面被处理的名称 |
使用示例
[root@localhost home]# tar -czf root-gzip.tar.gz root
[root@localhost home]# tar -cjf root-bzip.tar.gz root
[root@localhost home]# tar -cJf root-xz.tar.gz root
[root@localhost home]# ll -h root*
-rw-r--r-- 1 root root 368 Apr 2 15:46 root-bzip.tar.gz
-rw-r--r-- 1 root root 492 Apr 2 15:45 root-gzip.tar.gz
-rw-r--r-- 1 root root 384 Apr 2 15:47 root-xz.tar.gz
Linux 系统中并不存在文件拓展名,但是为了用户识别方便,创建文件名应该添加后缀。
解压
tar解压
当解压某个压缩文件时,首先需要知道文件是由何种压缩方式创建出来的,然后用相应的解压方式解压。
确定压缩方式
[root@localhost home]# file root-bzip.tar.gz
root-bzip.tar.gz: bzip2 compressed data, block size = 900k
[root@localhost home]# file root-gzip.tar.gz
root-gzip.tar.gz: gzip compressed data, from Unix, last modified: Sat Apr 2 15:45:02 2022
[root@localhost home]# file root-xz.tar.gz
root-xz.tar.gz: XZ compressed data
不解压的情况可以通过“-t” 查看打包的文件
[root@localhost home]# tar -tf root-bzip.tar.gz
root/
root/file1.gz
root/file10.gz
root/file11.gz
root/file12.gz
root/file13.gz
root/file14.gz
root/file15.gz
root/file16.gz
root/file17.gz
root/file18.gz
root/file19.gz
root/file2.gz
root/file20.gz
root/file3.gz
root/file4.gz
root/file5.gz
root/file6.gz
root/file7.gz
root/file8.gz
root/file9.gz
命令格式
不一一介绍只介绍几个常用的参数
参数 | 作用 |
---|---|
-C | 解压的指定目录 |
-x | 解打包或解压缩 |
-v | 显示解压过程 |
使用示例
[root@localhost home]# file root-bzip.tar.gz
root-bzip.tar.gz: bzip2 compressed data, block size = 900k
[root@localhost home]# tar -xvf root-bzip.tar.gz -C /home/
root/
root/file1.gz
root/file10.gz
root/file11.gz
root/file12.gz
root/file13.gz
root/file14.gz
root/file15.gz
root/file16.gz
root/file17.gz
root/file18.gz
root/file19.gz
root/file2.gz
root/file20.gz
root/file3.gz
root/file4.gz
root/file5.gz
root/file6.gz
root/file7.gz
root/file8.gz
root/file9.gz
直接打包并解压
tar -czf - root | tar -xzf - -C /tmp
unzip
后缀为zip的文件,直接使用zip解压即可
unzip xxx.zip