Shell 编程(三):Shell 编程中的常用工具

2023-02-17 17:09:26 浏览数 (1)

文件查找

命令比较

命令

使用场景

优缺点

find

查找某一类文件,比如文件名部分一致

功能强大,速度慢

locate

只能查找单个文件

功能单一,速度快

whereis

查找程序的可执行文件、帮助文档等

不常用

which

只查找程序的可执行文件

常用于查找程序的绝对路径

Locate命令

Locate可以让用户快速查找到所需要的文件或目录,它不会搜索全部数据信息,而是搜索数据库 /var/lib/mlocate/mlocate.db。此数据库是本地系统内所有文件名称及路径。系统会自动创建这个数据库,并且每天更新一次

安装

遇到错误“locate: 未找到命令”先安装

代码语言:javascript复制
 yum install mlocate -y
更新后台数据库(缓存)
代码语言:javascript复制
 updatedb
运行“locate inittab”查看是否成功
代码语言:javascript复制
[root@localhost /]# locate inittab
/etc/inittab
/usr/share/vim/vim74/syntax/inittab.vim
命令格式

命令格式

代码语言:javascript复制
 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相关的所有文件并且只展示一个
代码语言:javascript复制
[root@localhost /]# locate crontab -n 1
/etc/anacrontab

locate 与 find 不同: find 是去硬盘找,locate 只在 /var/lib/slocate 资料库中找。

Find 命令

Find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示

命令格式
代码语言:javascript复制
  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网卡文件

代码语言:javascript复制
[root@localhost ~]# find / -name "ifcfg-ens33"
/etc/sysconfig/network-scripts/ifcfg-ens33

2).在/etc、/usr、/home 目录下搜索ifcfg-ens33(其中*为通配符)

代码语言:javascript复制
[root@localhost /]# find /etc /usr /home -name "ifcfg-en*"
/etc/sysconfig/network-scripts/ifcfg-ens33

3).根据时间查找(atime、mtime、ctime)查找大于、等于、小于 5天的文件

代码语言:javascript复制
# 小于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级子目录开始搜索

代码语言:javascript复制
[root@localhost /]# find /etc -mindepth 3
/etc/rdma/modules/roce.conf
/etc/rdma/modules/opa.conf
...
/etc/nftables/osf/pf.os

5).查找当前目录下所有普通文件,但排除test目录

代码语言:javascript复制
[root@localhost /]# find . -path ./test -prune -o  -type f

6).搜索 /etc 下的文件(非目录),文件名以 conf 结尾,且大于 10k,然后将其删除|

代码语言:javascript复制
[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的值

代码语言:javascript复制
  [root@localhost /]# echo $PATH
  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

which会根据上面7个文件返回

命令格式
代码语言:javascript复制
  which [文件...]

为什么which后面是文件?因为Linux一起皆为文件,执行文件也是文件

参数

作用

-n<文件名长度>

指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。

-p<文件名长度>

与-n参数相同,但此处的<文件名长度>包括了文件的路径。

-w

指定输出时栏位的宽度。

-V

显示版本信息。

使用示例

查找“find”的绝对路径

代码语言:javascript复制
[root@localhost /]# which find
/usr/bin/find

查看指令”bash”的绝对路径

代码语言:javascript复制
[root@localhost /]# which bash
/usr/bin/bash

值得注意的是which查找文件会根据/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 这七个目录进行查找,优先查找到后返回。

Whereis 命令

在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。该指令只能用于查找二进制文件、源代码文件和man手册页

命令格式
代码语言:javascript复制
whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]    

|参数 | 作用|

| —|—| |-b |  只查找二进制文件。| | -B<目录> |  只在设置的目录下查找二进制文件。| |-f |  不显示文件名前的路径名称。| |-m |  只查找说明文件。| |-M<目录> |  只在设置的目录下查找说明文件。| |-s |  只查找原始代码文件。| |-S<目录> |  只在设置的目录下查找原始代码文件。| |-u |  查找不包含指定类型的文件。|

代码语言:javascript复制
#### 使用示例

查看"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

代码语言:javascript复制
[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

表示后面被处理的名称

使用示例
代码语言:javascript复制
[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解压

当解压某个压缩文件时,首先需要知道文件是由何种压缩方式创建出来的,然后用相应的解压方式解压。

确定压缩方式
代码语言:javascript复制
[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” 查看打包的文件

代码语言:javascript复制
[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

显示解压过程

使用示例
代码语言:javascript复制
[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

直接打包并解压

代码语言:javascript复制
tar -czf - root | tar -xzf - -C /tmp

unzip

后缀为zip的文件,直接使用zip解压即可

代码语言:javascript复制
unzip xxx.zip

0 人点赞