1. 文件
1.1 文件目录长格式解释
- 文件类型:第一个字母,文件种类有很多,因为Linux中沿袭了Unix的哲学:一切皆文件。但是linux的文件后缀名和文件类型没有关系,例如执行权限就可以执行,但是不一定执行成功罢了。单一文件或目录的最大容许文件名为255字节,大约是255个字符的长度。
- 普通文件
-
- 纯文本文件ASCII UTF-8
- 二进制文件binary
- 目录
d
directory - 符号链接文件
l
link - 设备文件
b|c
- 区块设备文件
b
block,例如/dev/sda
,随机访问,按数据块访问,大小是两个数存储于inode中,第一个是主设备号major number标识设备类型,第二个是次设备号minor number标识同一种类型中不同设备; - 字符设备文件
c
character,线性访问,按字符为单位 -
mknod [OPTION] ... NAME TYPE [MAJOR MINOR]
创建block或character特殊文件
-
-m
:指定权限
- 数据接口文件
s
socket,如常在/run
,/tmp
目录中看到 - 数据输送档
p
FIFO,pipe
- 文件权限:类型后9个字符
rw-r--r--
,分别是u
g
o
的权限,rwx
,分别是读、写和执行权限,位置不会变,-
是无该权限; - 硬连接数:是硬连接数,连接到该文件的数量;
- 属主:owner,文件拥有者,这里是
root
; - 属组:group,文件所属群组,这里是
root
; - 文件大小:size,默认单位是字节,使用
-h
可以变为人类友好显示; - 时间戳:timestamp,创建日期或者最近修改日期,显示完整时间需要
ls -l --full-time
;
- 访问(access):
- 修改(modify):文件自身数据修改时间
- 改变(change):metadata,文件属性数据改变时间
- 文件名/目录名
1.2 文件目录配置标准--FHS
Filesystem Hierarchy Standard,FHS针对目录树结构仅定义了三层目录放置什么数据,各个目录下面又有明确的说明:
-
/
(root,根目录):与系统开机/还原/修复等有关。所有的目录都由根目录衍生出来,根目录不建议放在很大的分区,分区越大放入数据越多,错误机会越高,但同时也要能够容纳足够的修复文件系统的程序; -
/usr
(unix software resource):与软件安装执行相关;【basil:原来usr不是user的缩写,而是UNIX软件资源】 -
/var
(variable):与系统运行过程有关。
可分享的(shareable) | 不可分享的(unshareable) | |
不变的(static) | /usr(软件放置处)<br />/opt(第三方软件) | /etc(配置文件)<br />/boot(开机与核芯文档) |
可变的(variable) | /var/mail(使用者邮件邮箱)<br />/var/spool/news(新闻群组) | /var/run(程序相关)<br />/var/lock(程序相关) |
1.3 文件
1.3.1 命名规则
- 长度不能超过255个字符
- 不能使用
/
当文件名, 其它字符都可以 - 严格区分大小写
1.3.2 FD简介
file descriptors,FD,文件描述符,文件句柄,进程使用fd来管理打开的文件。是8位的整数(0~255)
-
0
:stdin,标准输入 -
1
:stdout,标准输出 -
2
:stderr,标准错误输出
1.4 操作
1.4.1 目录操作
1.4.2 文件操作
1.5 grep
1.5.1 简介
根据模式搜索文本,并将符合模式的文本行显示出来。
1.5.2 正则表达式
- 元字符:
-
.
: 匹配任意单个字符 -
[]
: 匹配指定范围内的任意单个字符 -
[^]
:匹配指定范围外的任意单个字符 - 字符集合:
[:digit:]
, [:lower:]
, [:upper:]
, [:punct:]
, [:space:]
, [:alpha:]
, [:alnum:]
- 匹配次数(贪婪模式):
-
*
: 匹配其前面的字符任意次 -
.*
: 任意长度的任意字符 -
\?
: 匹配其前面的字符1次或0次 -
\{m,n\}
:匹配其前面的字符至少m次,至多n次;n不写表示至少m次,m不能不写。
- 位置锚定:
-
^
: 锚定行首,此字符后面的任意内容必须出现在行首 -
$
: 锚定行尾,此字符前面的任意内容必须出现在行尾 -
^$
: 空白行 -
\<
或\b
: 锚定词首,其后面的任意字符必须作为单词首部出现 -
\>
或\b
: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
- 分组:
-
\(\)
:把内容分组,举例:\(ab\)*
,ab
是一个整体出现任意次 - 分组引用:
\<num>
: 引用第<num>
个左括号以及与之对应的右括号所包括的所有内容。
1.5.3 egrep
==grep -E
正则表达式分为两类:Basic REGEXP以及Extended REGEXP。
基本的正则表达式见上面,扩展的正则表达式:
- 字符匹配
-
.
: 匹配任意单个字符 -
[]
: 匹配指定范围内的任意单个字符 -
[^]
:匹配指定范围外的任意单个字符
- 次数匹配
-
*
: 匹配其前面的字符任意次 -
?
: 匹配其前面的字符只有一次 -
+
: 匹配其前面的字符至少一次 -
{m, n}
:指定次数
- 位置锚定
-
^
: 锚定行首,此字符后面的任意内容必须出现在行首 -
$
: 锚定行尾,此字符前面的任意内容必须出现在行尾 -
^$
: 空白行 -
\<
或\b
: 锚定词首,其后面的任意字符必须作为单词首部出现 -
\>
或\b
: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
- 分组
-
()
:把内容分组,举例:(ab)*
,ab
是一个整体出现任意次 - 分组引用:
\<num>
: 引用第<num>
个左括号以及与之对应的右括号所包括的所有内容。
- 或者:
|
,OR
- 举例:
C|cat
表示C
或cat
- 举例:
(C|c)at
表示Cat
或cat
1.5.4 fgrep
不支持正则表达式,速度比较快,只支持根据字符本身来匹配。
1.7 sed
数据流编辑器,Stream EDitor。是一个行编辑器,操纵文本,类似vim。通过模式匹配可以指定要编辑的行,要在模式空间进行处理,所以不会处理原文本,模式空间中处理结果显示在屏幕或者输出重定向。“模式-匹配-显示”。
man sed
可以显示其文档。使用sed
的基本格式是:sed [OPTIONS] 'AddressCommand' file ...
。
- 常用
OPTIONS
-
-n
:静默模式,不会再默认显示模式空间中的内容。 -
-i
:直接修改原文件 -
-e SCRIPT1 -e SCRIPT2
:可以同时执行多个sed脚本,每个AddressCommand
称为一个脚本 -
-f /path/to/SCRIPT
:指定sed脚本文件 -
-r
:使用扩展的正则表达式
-
Address
的格式
-
StartLine,EndLine
如1,100
表示第1到100行,$
表示最后一行; -
/RegExp/
如/^root/
表示以root
开头的行; -
/pattern1/,/pattern2/
表示从第一次被/pattern1/
匹配行开始,从第一次被/pattern2/
匹配行结束; -
LineNum
表示指定匹配某一行; -
StartLine,+N
表示从指定行开始,向后的N
行,共N+1
行。
-
Command
常用
-
d
:删除某一行; -
p
:显示符合条件的行; -
a \"string"
:在指定的行后面追加新行,内容为"string"
,换行符为\n
; -
i \"string
:在指定的行前面追加新行,内容为"string"
,换行符为\n
; -
r FILENAME
:将FILENAME
中的内容添加到符合条件的行数; -
w FILENAME
:将指定范围地址的行内容另存至指定的文件中; -
s/pattern/string/[g|i]
:将pattern
第一次匹配的内容替换为string
,如果全部替换,最后加上g
,i
表示忽略大小写;这里/
可以替换成大部分符号,只要三个一致即可,如s###
,s@@@
;这里可以使用后向引用\(\)
和\1
,或者&
表示匹配到的内容;
练习
- 删除/etc/grub.conf文件中行首的空白符;
sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf
- 替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
- 删除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab
- 删除/etc/inittab文件中开头的#号;
sed 's@^#@@g' /etc/inittab
- 删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符;
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
- 删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
- 取出一个文件路径的目录名称;
echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
基名:
echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g'
1.8 awk
报告文本生成器,也是文本处理工具。指定分割符,显示对应段。同sed
按照行进行处理,按照分割符分割,逐段命名$1, $2,...
。
awk [options] 'script' file1 file2, ...
awk [options] 'PATTERN { action }' file1 file2, ...
ACTION
-
'{print ARG1, ARG2, ...}'
这里必须使用''
单引号引起来,而且要分开不同的项目需要使用逗号,
,输出的参数可以为字符串或数值、当前记录的字段(如$1
)、变量或awk
的表达式;数值会先转换为字符串,而后再输出;print
命令后面的参数可以省略,此时其功能相当于print $0
,因此,如果想输出空白行,则需要使用print ""
。
OPTIONS
-
-F[src_delimer]
:指定输入文件的分割符,awk -F: '{print $1}' /etc/passwd
2. 文件查找
2.1 find
实时、精确,遍历指定目录中的所有文件完成查找,速度相对较慢。
支持更多的查找动作。
格式
默认路径是当前目录,默认查找当前路径下所有文件,处理动作默认为显示。
2.1.1 选项
-
-name FILENAME
:查找对应文件名,可以带有*
表示通配符
-
-i FILENAME
:ignorecase, 不区分文件名大小写
-
-regex PATTERN
:基于正则表达式进行查找 -
-user USER
:根据文件的属主进行查找
-
-group GROUP
:根据文件的属组进行查找
-
-nouser
:查找没有属主的文件 -
-nogroup
:查找没有属组的文件 -
-size
: 文件大小,+
代表大于,-
代表小于,没有则是相等
-
-type FILETYPE
:-type:按照文件类型来查找
-
-maxdepth
:几级目录
- 连接两个选项,
-a
是and与,默认即是and,-o
是or或,-not
是not非
-
-perm
:按照文件的权限来查找,permission
-
MODE
:精确匹配 -
-MODE
:文件权限能够完全包含此MODE时才符合条件 -
/MODE
:9位权限(rwxrwxrwx
)中任何一位匹配就可以
- 动作
- 默认不写,是
-print
-
-ls
是长格式查看,类似ll
-
-delete
是删除 -
-ok COMMAND {} \;
找到了执行命令, 每次都需要用户确认,{}
代表是源文件(引用),\;
是结束符 -
-exec COMMAND {} \;
找到了执行命令, 不需要用户确认,{}
代表是源文件(引用),\;
是结束符 - 也可以和
xargs
连用
2.1.2 练习
2.2 which
/whereis
查找命令或软件的绝对路径。
2.3 locate
好像不自带。配套updatedb
强制刷新系统,更新会很慢,因为是整个系统级别
属于非实时查找的,模糊匹配,查找的结果可能包含目录,但是查找速度比较快。
3. 文件打包和压缩
常见压缩格式:gz、bz2、xz、zip。
3.1 打包
tar
,是*nix系统中备份文件的可靠方法,几乎可以工作于任何环境中,它的使用权限是所有用户,建议针对目录来做。
打包, tar -cvf etc.tar /etc
,-c
(reate)创建, -v
(erbose)显示过程,-f
(ilename)打包名。
3.2 压缩解压
- 只能压缩文件
-
gzip FILENAME
:压缩,之后会删除源文件,生成FILENAME.gz
。解压缩使用gunzip FILENAME.gz
。
-
gzip -d FILENAME.gz
也是解压缩; -
gzip -9 FILENAME
是指定压缩比,可以指定1-9
,默认是6
; -
zcat FILENAME.gz
是查看压缩文件中的内容,但是不会解压文本文件;
-
bzip2 FILENAME
:压缩,比gzip压缩比更大,使用格式近似于gzip,选项也类似-d
-9
。不同的选项-k
可以保留源文件。bunzip FILENAME.bz2
也用于解压缩。
-
bzcat FILENAME.gz
查看压缩文件的内容,不会解压文件。
-
xz FILENAME
:压缩比比bzip2更大,也会删除源文件。-d
-9
-k
使用方法同bzip2。unxz
或者xzdec
也是解压缩。
- 可以压缩目录和文件
-
zip FILENAME.zip FILE1 FILE2...
:压缩比不大,可以压缩目录。归档指把多个文件归档成一个,归档本身不意味着压缩。会默认保留源文件。
- 只归档不压缩
-
tar
:只归档不压缩的工具,就是多个文件打成一个tar包。
-
-c
:创建归档文件 -
-f FILE.tar
:指定文件tar包名 -
-x
:指定解包名 -
--xattrs
:归档时,保留文件的扩展属性信息 -
-t
:不解压不展开归档时查看归档了哪些文件
压缩
-
tar -czf etc.tar.gz /etc
,-z
就代表gzip格式来压缩。 -
tar -cjf etc.tar.bz2 /etc
,-j
是代表bzip2格式来压缩。压缩比例比gzip大。 -
tar -cJf etc.tar.xz /etc
,-J
是代表xzip格式来压缩。压缩比例比bzip2大。
解压/解包,tar -xvf etc.tar
,-x
是解包,-f
指定要解压的文件名
-
tar -tf etc.tar
,-t
指定-f
的文件名,不解压,只是查看其中的文件 -
-C
将解压出来的内容放到的目录,目录需要先存在 -
tar -zxvf etc.tar.gz
,-z
指定解压方式是gzip,不指定linux也会自己判断
cpio
也是一个归档工具。