【Linux】Linux学习之文件查找、文件打包和解压缩、文件系统操作与磁盘管理、帮助命令、任务计划crontab
6.文件查找
与搜索相关的命令常用的有whereis
、which
、find
和locate
。
whereis
简单快速whereis <关键词>
whereis
搜索很快,因为其并没有从硬盘中依次查找,而是直接从数据库中查询。缺点是只能搜索二进制文件(-b
)、man帮助文件(-m
)和源代码文件(-s
)。如果想要获得更全面的搜索结果可以使用locate
命令。locate
快而全使用该命令查找文件也不会遍历硬盘,它通过查询
/var/lib/mlocate/mlocate.db
数据库来检索信息。不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行update
命令来更新数据库。所以有时候你刚添加的文件,可能会找不到,需要手动执行一次update
命令。注意:这个命令非内置命令,在部分环境中需要手动安装,然后执行更新。
sudo apt-get update
sudo apt-get install locate
sudo updatedb
可以用来查找指定目录下的不同文件类型,如查找
/etc
下所有以sh开头的文件:locate /etc/sh
注意,它不只是在
/etc
目录下查找,还可以自动递归子目录进行查找。which
小而精其本身是Shell内建的一个命令,我们通常使用
which
来确定是否安装了某个指定的程序。因为它只从PATH
环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果。也就是说,我们可以看到某个系统命令是否存在以及执行的到底是哪个一个地方的命令。which <程序名>
find
精而细该命令是这几个命令中最强大的,不但可以通过文件类型、文件名进行查找,而且可以根据文件的属性(如文件的时间戳、文件的权限等)进行搜索。
find <path> <option> <action>
该命令常用参数:
参数 说明 -name
、-iname
文件名称符合name的文件,后者会忽略大小写。 -atime
在过去n天内被读取过的文件 -ctime
在过去n天内被修改过内容的文件 -mtime
在过去n天内被修改过属性的文件 下面以
-mtime
参数举例:-mtime n
:n为数字,表示为在n天之前的“一天之内”修改过的文件-mtime n
:列出在n天之前(不包括n天本身)被修改过的文件-mtime -n
:列出在n天之内(包括n天本身)被修改过的文件-newer file
:file为一个已存在的文件,列出比file还要新的文件名
列出home
目录中,当天(24小时之内)有改动的文件:
find ~ -mtime 0
列出home
目录下比/etc
目录新的文件:
find ~ -newer /etc
7.文件打包和解压缩
Linux常见的压缩格式:
文件后缀名 | 说明 |
---|---|
*.zip | zip程序打包压缩的文件 |
*.rar | rar程序压缩的文件 |
*.7z | 7zip程序压缩的文件 |
*.tar | tar程序打包,未压缩的文件 |
*.gz | gzip程序(GNU zip)压缩的文件 |
*.xz | xz程序压缩的文件 |
*.bz2 | bzip2程序压缩的文件 |
*.tar.gz | tar打包,gzip程序压缩的文件 |
*.tar.xz | tar打包,xz程序压缩的文件 |
*.tar.bz2 | tar打包,bzip2程序压缩的文件 |
*.tar.7z | tar打包,7z程序压缩的文件 |
一般只需要掌握几个命令即可,包括zip、tar。
7.1zip压缩打包程序
使用zip打包文件夹
zip -r -1 -q -o <file name> <path>
上述命令中,
-r
参数表示递归打包包含子目录的全部内容;-1
代表压缩级别,1表示最快压缩但体积大,9表示体积最小但是耗时最久;-q
表示安静模式,即不向屏幕输出信息;-o
表示输出文件,需要在后面紧跟打包输出文件名。打包完成后可以使用du
命令查看打包后的文件信息。du -h <file name>
创建加密zip包
zip -r -e -o <file name> <path>
注意:关于
zip
命令,因为Windows系统与Linux/Unix在文本文件格式上的一些兼容问题,比如换行符(不可见字符),在Windows为CR LF(Carriage-Return Line-Feed:回车 换行),而在Linux/Unix上为LF(换行),所以如果在不加处理的情况下,在Linux上编辑的文本,在Windows上打开可能看起来没有换行,此时需要使用参数-l
来将LF转换为CR LF。
zip -r -l -o <file name> <path>
7.2使用unzip命令解压缩zip文件
将压缩文件解压到当前目录:
unzip <file name>
使用安静模式,将文件解压到指定目录:
unzip -q <file name> -d <path>
上述指定目录若不存在,则自动创建,如果不想解压只想查看压缩包内容,可以使用参数-l
:
unzip -l <file name>
注意:使用unzip解压文件时同样要注意兼容问题。通常在Windows系统上创建的压缩文件,如果包含中文的文档或以中文为文件名的文件时,默认采用GBK或其他编码,Linux上默认使用UTF-8编码。如果不加任何处理,直接解压可能会出现中文乱码的问题。可以使用参数
-O(英文大写O)
解决。如下:
unzip -O GBK 中文压缩文件.zip
7.3tar打包工具
在Linux上常用的打包工具tar工具,其同时实现了对7z、gzip、下载、bzip2等工具的支持。
创建一个tar包
tar -P -cvf <file name> <path>
其中,
-P
保留绝对路径符,-c
表示创建一个tar包文件,-v
以可视的方式输出打包的文件,-f
用于指定创建的文件名。注意1:参数
-P
用来保留绝对路径,即允许备份数据中含有根目录存在之意。也就是说,如果保留有绝对路径,解压后的数据会根据压缩时的绝对路径去还原,否则从当前工作目录解压。注意2:解压必须指定参数
-P
才能将数据按绝对路径还原。注意3:参数
-f
后面必须紧跟文件名,比如不能写成tar -fc demo.tar ~
,可以写成tar -f demo.tar -c ~
。解压一个文件到指定路径的已存在目录
tar -xf <file name> -C <path>
其中,
-x
表示解压,-C
指定目录只查看不解包文件
tar -tf <file name>
保留文件属性和跟随链接(符号链接或软链接),有时候我们使用tar备份文件,当你在其他主机还原时希望保留文件的属性(
-p
参数)和备份链接指向的源文件,而不是链接本身(-h
参数)tar -cphf <file name> <path>
对于创建不同压缩格式的文件,对于tar来说相当简单,只需要换一个参数,如下使用gzip压缩文件:
tar -czf <file name> <path>
解压*.tar.gz文件:
tar -xzf <file name>
以下是tar工具常用的参数:
参数 | 说明 |
---|---|
-c |
建立压缩档案 |
-x |
解压 |
-t |
查看内容 |
-r |
向压缩归档文件末尾追加文件 |
-u |
更新原压缩包的文件 |
-v |
显示所有过程 |
-z |
压缩文件格式为:*.tar.gz |
-J |
压缩文件格式为:*.tar.xz |
-j |
压缩文件格式为:*.tar.bz2 |
8.文件系统操作与磁盘管理
8.1查看磁盘和目录的容量
- 使用
df
命令查看磁盘的容量
第一列指定文件系统的名称,第二列指定磁盘块容量大小,第三四列分别是已用和可用,第五列指定使用的内存百分比,最后一栏指定的文件系统的挂载点。
使用参数-h
,使用人类可读的格式,如下:
df -h
8.2使用du
命令查看目录的容量
du -h -d 0 <path>
其中参数-h
代表更易读的方式;参数-d
代表查看目录的深度,后面紧跟深度;0
代表只查看一级目录的信息,同理1
代表查看二级……
常用参数:
参数 | 说明 |
---|---|
-a |
同--all ,显示目录中所有文件的大小 |
-s |
同--summarize ,仅显示总计,只列出最后加总的值 |
8.3简单的磁盘管理
//TODO 创建虚拟磁盘
//TODO 格式化磁盘
//TODO 将磁盘挂载到目录
9.Linux下的帮助命令
9.1内建命令和外部命令
内建命令:实际上是shell程序的一部分,其中包含的是一些比较简单的Linux系统命令,这些命令是写在bash源码的builtins里面,由shell程序识别并在shell程序内部完成运行。通常在Linux系统加载运行时shell就被加载被驻留在系统内存中。而且解析内部命令shell不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit等。
外部命令:Linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在shell中,但是其命令执行过程是由shell程序控制的。外部命令是在Bash之外额外安装的,通常放在/bin
、/sbin
、/usr/bin
等。比如:ls
、vi
等。
简单来说,内建命令是先天自带的,外部命令是后天装载的。可以使用
type
命令来区分命令是内建还是外部。
type <command>
通常会得到三种情况:
xxx is a shell builtin
说明该命令是内建命令,正如上文所说内建命令都是在bash源码中的builtins的.def
中xxx is /usr/bin/xxx
说明该命令是外部命令,正如上文所说,外部命令在/usr/bin
or/usr/sbin
等等中xxx is an alias for xx --xxx
说明该指令为命令别名所设定的名称
9.2帮助命令的使用
help
命令若查看的命令为内建命令,则:
help <command>
若为外部命令,一般外部命令基本上都有一个参数
--help
,则:<command> --help
注意:在zsh中内置并没有
help
命令,若要查看,需切换至bash。//TDOD zsh与bash异同优劣
man
命令该命令得到的内容比用
help
更多更详细,而且man
命令没有内建和外部命令的区分。但是并非代表help
命令没有存在必要,因为help
这种显示简单扼要的信息特别使用,不太紧急的时候可以用man
命令这种详细描述的查询方式。在
man
命令的手册中,分有多个章节,如下:章节数 说明 1 Standard commands(标准命令) 2 System calls(系统调用) 3 Library functions(库函数) 4 Special devices(设备说明) 5 File formats(文件格式) 6 Games and toys(游戏和娱乐) 7 Miscellaneous(杂项) 8 Administrative Commands(管理员命令) 9 其他(Linux特定的),用来存放内核例行程序的文档 info
命令该命令来自自由软件基金会的GNU项目,是GNU的超文本帮助系统,能够更完整的显示出GNU信息。
man
和info
就像两个集合,它们有一个交集部分,但与man
相比,info
工具可显示更完整的GNU工具信息。若man
页包含的某个工具的概要信息在info
中也有介绍,那么man
页中会有请参考info
页更详细内容的字样。
10. Linux任务计划crontab
crontab
命令常见于Unix和类Unix的操作系统中,用于设置周期性被执行的指令。
该命令从输入设备读取指令,并将其存放在crontab文件中,以供之后读取和执行。通常,crontab储存的指令被守护进程激活,crond为其守护进程,crond常常在后台运行,每一分钟都会检查一次是否有预定的作业需要执行。
通过crontab
命令,我们可以在固定的间隔时间执行指定的系统指令或shell脚本。时间间隔的单位可以是分钟、小时、日、周和月的任意组合。
crontab的格式:
准备工作
查看rsyslog和cron是否启动。前者以便我们可以通过日志中的信息来了解我们的任务是否真的被执行了,后者需要启动cron来检查是否有预定的指令执行。
若rsyslog未启动/安装,则:
sudo apt-get install -y rsyslog
sudo service rsyslog start
若cron未启动,则:
sudo cron -f &
添加计划任务
使用
crontab
命令添加计划任务:crontab -e
在文档中,新增一行计划任务,如下为每隔一分钟便在
/home/demo
目录下创建一个以时间戳为名的空白文件:0 0/1 * * * ? * touch /home/demo/$(date \%Y\%m\%d\%H\%M\%S)
"%"
在crontab文件中,具有结束命令行、换行、重定向的作用,此时需要加"\"
来进行转义。cron表达式可以通过cron表达式在线生成器来生成。
将文档保存退出,可以通过以下指令查看添加了什么任务:
crontab -l
注意:新创建的任务,不会马上执行,至少要过2分钟之后才可以。可以通过重启cron使其立即执行。
任务执行之后,可以通过查看
syslog
日志,查看任务是否执行:sudo tail -f /var/log/syslog
当任务执行完毕后,可以通过以下命令删除任务:
crontab -r
crontab
深入每个用户使用
crontab -e
添加计划任务,都会在/var/spool/cron/crontabs
中添加一个该用户自己的任务文档,这样的目的是为了隔离。如果是系统级别的定时任务,只需要使用
sudo
去编辑/etc/crontab
文件即可。cron服务检测时间最小单位是分钟,所以cron每分钟会读取一次/etc/crontab
与/var/spool/cron/crontabs
里面的内容。