清理一下自己的OneNote,把笔记迁移到博客上来。
文件管理
下面的命令中只列出了常用参数,并非所有,如果想了解其他参数,请使用man命令查看详细解释。
cat 命令
读取文件并打印到标准输出设备上
语法:cat [-nbs…] fileName
常用参数:
- -n 对输出的行数进行编号
- -b 和-n相似,只不过对空白行不编号
- -s 遇到有两行以上的空白行,就代换为一行的空白行
示例:cat -bs /tmp/1.txt > /temp/2.txt 将1.txt 中的内容输入到2.txt中
chattr 属性
用于改变ext2文件系统上的文件或目录属性,所谓ext2文件系统就是以inode为基础的文件系统
语法:chattr [-RVf] [-+=AaCcDdeijsSu] [-v version] files…
常用参数:
-
-R 递归处理,将制定目录下的所有文件和子目录一并处理
-
-v<版本编号> 设置文件或目录的版本
-
-V 显示执行执行过程
-
+<属性> 开启文件或目录的该项属性
-
-<属性> 关闭属性
-
=<属性> 制定属性
属性: -
A:不更新文件或目录的最后访问时间,这样可以有效的降低磁盘I/O
-
a:让文件或目录只提供附加属性
-
b:不更新文件或目录的最后修改时间
-
c:将文件或目录压缩后存放
-
d:将文件或目录排除在dump操作之外
-
i:不得任意改动文件或目录
-
s:保密性删除文件或目录
-
S:即时更新文件或目录
-
u:预防意外删除
示例:使用 chattr +i /tmp/1.txt 禁止修改,我们使用vi编辑后,出现提示如下:
chgrp命令
用于变更文件或目录的所属组群
语法:chgrp [-cfhRV] [所属组群] [文件或目录]
常用参数:
- -v 显示指令的执行过程
- -c 类似于 -v ,但是仅显示更改的部分
- -h 只对符号链接的文件做修改,而不改动其他任何相关文件
- -R 递归处理,将制定目录下的所有文件和子目录一并处理
示例:chgrp -v guest /tmp/1.txt
chmod命令
修改文件或目录的权限,Linux的权限分为三级:文件的拥有者、组群、其他,可以通过修改权限来控制文件如何被他人使用。
语法:chmod[-cfVR] [ugoa] [+-=] [rwxX…] file…
参数说明:
- -c:表示文件权限确实已经更改,才显示器更改动作
- -v:显示权限变更的详细资料
- -R:递归变更,即对当前目录下的所有文件及其子目录进行相同的权限变更
- u 表示该文件的拥有者,g 表示的群体,o 标识其他,a 标识这三者均是
-
- 表示添加权限、- 表示取消权限、= 表示设定权限
- r 表示可读、w 表示可写、x 表示可执行,X 表示只有当该文件是目录或者对一些用户已经有执行权限的时候才执行
示例:chmod u+x /tmp/2.txt
此外,还可以使用数字来表示权限,其中 r=4,w=2,x=1,rwx的属性为4+2+1=7,rw的属性为4+2=6,以此类推,比如给出所有权限 chmod 777 file。
chown 命令
修改文件的拥有者,这个命令的使用需要root权限。
语法:chown [-cfhvR] user [:group] file…
常用参数:
- -v:显示详细的处理信息
- -R:递归处理
- user:新的文件的拥有者ID
- gourp:新的文件拥有者的组别
示例:chown guest /tmp/2.txt
cksum 命令
通过检查文件的CRC是否正确,校验文件完整性,至少可以检测到99.998%的已知错误
语法:cksum file…
示例:cksum /tmp/2.txt
如果文件内容发生了任何修改,都会改变CRC校验码的值。
cmp命令
用于比较两个文件是否有差异,若两个文件完全一样,则不会显示任何信息。若发现差异,则会标出第一个不同之处的字符和列数编号。
语法: cmp [-clsv][-i<字符数目>] file1 file2
参数:
- -c 除了标明差异之外,同时显示该处对应的字符
- -i 指定字符数目
- -l 标记所有不一样的地方
示例:cmp /tmp/1.txt /tmp/2.txt
diff命令
用于比较文件的差异,diff以逐行的方式比较文本的异同;如果指定比较目录,diff会比较目录中同名的同名文件,但不会比较子目录。
语法:diff [OPTION]... FILES
扩展:Runoob上的更为清晰https://www.runoob.com/linux/linux-comm-diff.html。
常用参数:
- -c 显示全部内容,并标出不同
- -C<行数> 与执行 -c -<行数>指令相同
- -H 大文件时,可以加快速度
- -l<字符或字符串> 若两个文件只是某几行不同,而这几行都包含了所指定的字符或字符串,则不显示这两个文件的差异
- -i 忽略大小写
- -r 比较子目录中的文件
- -w 忽略全部的空格字符
- -y 以并列的方式显示文件的异同
- -W 配合-y使用,指定栏宽
示例:diff -y -W 50 /tmp/2.txt /tmp/3.txt
这里的“|”表示该行的前后内容不同,“<”表示后面文件比前面文件少了1行内容,“>”表示后面文件比前面文件多了一行内容,上面的这种格式是正常格式(normal diff)输出,最早的Unix版本用的就是这种格式。不过上个世纪80年代初,加州大学伯克利分校推出BSD版本时,觉得正常格式显示太简单,于是在原来的基础上加入了上下文,也就是第二种格式,上下文格式(context diff):
前两行显示的是对比的文件及修改时间信息,“*1,8”表示从第一行开始连续8行,对比结果的每一行前面都有一个标记位。如果为空标,表示该行无变化,如果为感叹号(!)表示该行有改动;如果为减号(-),表示该行被删除;如果为加号(+),则表示该行为新增。“----1,5---”表示第二个文件的对比,与第一个相似。但是如果2.txt和3.txt的相似度很高的话,就会显示大量重复的内容,于是GNU diff推出了“合并格式”的diff,将2.txt和3.txt合并显示:
变动位置用字符串“@@-1,8 +1,5@@”表示,“-1,8”表示第一个文件的第1到8行,“+1,5”表示第二个文件的1到5行,这个字符串下面就是具体的变动内容。空表示无变动,“-”表示第一个文件删除的行,“+”标识第二个文件新增的行。不过我还是喜欢GUI比较工具,更为直观显眼,Linux推荐Kompare、DiffMerge、KDiff3、TKdiff等工具。
file命令
用于辨识文件类型
语法:file [-bcLvz] [-f <文件名>] [-m<魔法数字文件>…] [文件或目录…]
常用参数:
- -b 只列出结果,不显示文件名
- -L 显示链接文件指向文件的类比
- -f 指定名称文件
- -z 尝试解读压缩文件内容
示例:
这里的魔法文件即Linux的magic file,指那些具有特殊文件格式的文件,比如C文件,有#include字样;tar文件前几个字节有特殊的规则,我们可以自己定义magic file规则判断文件类型。
find命令
用来在指定目录下查找文件。
语法: find path -option [-print] [-exec -ok command] {} ;
常用参数:
- -mount,-xdev:只检索和指定目录在同一个文件系统下的文件,避免出现其他系统中的文件
- -admin n:在过去n分钟内被读取过的文件
- -anewer file:比文件file更晚被读取过的文件
- -atime,mtime,ctime n:在过去n天内被访问、修改、最后改变的文件
- -amin,mmin,cmin n:同上,不过时间单位为分钟
- -empty:空的文件
- -gid n,-group :gid是n或者group名称是
- -ipath ***,-path :路径名称符合的文件,ipath会忽略大小写
- -name ***,-ipath :文件命名称符合的文件,iname会忽略大小写
- -type c:文件类型是c的文件,d表示目录,c表示字型装置文件,b表示区块装置文件,p表示FIFO,命名管道;f表示一般文件,l表示符号链接,s表示socket。
示例:
ln 命令
为某一个文件在另外一个位置上建立一个同步的链接。
语法:ln [-bdfinsv] [源文件或目录] [目标文件或目录]
常用参数:
- -b 删除,覆盖以前建立的链接
- -f 强制执行
- -i 交互模式,文件存在则提示用户是否覆盖
- -n 把符号链接视为一般目录
- -s 软连接(符号链接),不指定则为硬链接
- -v 显示详细的处理过程
示例:
如图所示,我们建立了一个软连接“2”,指向“2.txt”,“2”的权限一列开头为“l”,表示这个文件为link,如果我们修改了“2”,在“2”的末尾追加一行“g”,那么“2.txt”中的内容也会改变。
Linux中的链接可以分为两种:硬链接(hard link)与软连接(symbolic link):
硬链接:
之前讲解过indode的相关知识,硬链接其实是多个文件名指向同一个索引节点(inode),其作用之一就是允许一个文件可以同时拥有多个有效路径,这样可以放置“误删”源数据,因为在Linux的文件系统中,只要索引节点还有一个以上的链接,就不会释放文件的block,这样就可以起到保护重要文件的作用。
- 通过索引节点来进行链接
- 以文件副本的形式存在,不占用实际空间
- 只能创建文件副本,无法创建目录副本
- 必须在同一个文件系统中
软链接: - 以路径的形式存在,类似于Windows中的快捷方式
- 可以跨越文件系统
- 可以对一个不存在的文件名进行链接
- 对目录和文件均可以进行链接
less命令
用于浏览文件,支持向前向后移动,这个命令在查看特别长的内容时,很高效,而且less在查看之前不会加载整个文件。
语法:less [-befgimNs] file
常用参数:
- -b<缓冲区大小> 设置缓冲区的大小
- -e 当文件结束后,自动离开
- -f 强迫打开特殊文件,如二进制文件,目录等
- -g 只标记后面搜索的关键词
- -i 搜索时忽略大小写
- -N 显示每行的行号
- -m 显示百分比,类似于more
- -s 显示连续空行为一行
- q/Q 退出当前界面
操作:进入less的视图界面后,我们可以使用“b”向上翻页,“d”向下翻半页,“u”向前滚动半页,“y”向前滚动一行,“Space键”滚动一页,“Enter键”滚动一行,“PgUp”上翻一页,“PgDn”下翻一页;若是需要搜索,可以使用“/字符串”向下搜索或“?字符串”向上搜索,配合“n”重复前一个搜索,“N”反向重复前一个搜索来操作。
示例:
如“less /temp/1.txt”,当然我们还可以对其他的输出使用“less”命令,如“ps -ef|less”
locate命令
用于查找符合条件的文档
语法: locate [OPTION]... PATTERN…
示例:locate 2.txt
和 find 不同的是,find 是去硬盘中查找,而locate则是建立了一个包括系统内所有档案名称和路径的数据库,搜索时在库中查找,速度比find快,所以他需要一个库(在/var/lib/mlocate/mlocate.db),一个配置文件(updatedb.conf),一个定时执行(crontab)。因为locate的查找依赖于db(一般系统自己维护)查找不是实时的,所以我们可能会用到升级数据库命令:locate -- u(注意这个命令 -- 和 u 之间有空格)。其实在我本机,由于2.txt是建立在/tmp文件夹下的,这个时候“2.txt”是搜索不到的,是什么原因造成的呢?我们可以打开/etc/update.conf看一下:
可以看到在updatedb.conf中忽略了/tmp文件夹,所以我们在使用locate搜索时,需要清楚这一点。
which命令
用于查找环境变量$PATH设置的目录中符合条件的文件
语法:which [文件…]
示例:which sudo
whereis命令
用于查找文件
语法: whereis [-bfmsu][-B<目录>…][-M<目录>…][-S<目录>…][文件…]
常用参数:
- -b 只查找二进制文件
- -B<目录> 只在设置的目录下查找二进制文件
- -f 不显示文件名前的路径名称
- -m 只查找说明文件
- -M<目录> 只在设置的目录下查找原始代码文件
- -u 查找不包含指定类型的文件
示例:whereis nginx
这里总结一下,Linux常见的查找命令有5个:find、locate、whereis、which、type,find最常见也最强大,基本上可以用它找到想要的任何文件;locate是基于搜索库的查询,速度比find快,但可能需要手动更新库,同时他也排除掉了一些文件类型和文件夹;whereis则主要用于程序名的搜索;which则主要用于搜索系统命令;type则主要用于区分一个命令是由shell提供的,还是独立的二进制文件提供的。
mv 命令
用来为文件或目录改名,或将文件或目录移入其他位置。
语法:mv [-if] source dest,directory
常用参数:
- -i 若指定目录已有同名文件,则先询问是否覆盖旧文件
- -f 若存在同名文件,不进行任何提示,直接覆盖
示例:
mv /tmp/2.txt /tmp/22.txt
cp命令
用于复制文件或目录
语法:cp[options] source dest 或 cp [options] source… directory
常用参数:
- -a:通常在复制目录时使用,保留链接、文件属性,并复制目录下的所有内容,相当于dpR参数组合
- -d:复制时保留链接
- -f:覆盖已经存在的目标文件而不给出提示
- -i:与-f相反,对于已存在的目标文件,需要对用户进行问询
- -p:除复制文件内容外,同时复制修改时间和访问权限到目标文件中
- -r:若源文件为目录,复制时采用递归
- -I:不复制文件,只生成链接文件
示例: cp -r /tmp /tmp2 复制文件夹、cp /tmp/2.txt /tmp2/2_bak.txt 复制文件
rcp命令
用于复制远程文件或目录。
语法:rcp [-pr] [源文件或目录..] [目标文件或目录]
常用参数:
- -p 保留源文件或目录的属性,包括拥有者,所属组群,权限与时间
- -f 递归处理,将制定目录下的文件与子目录一起处理
示例:
rcp root@192.168.85.127:./1.txt 1.txt
由于rcp执行后并无返回信息,所以需要在目录下查看文件是否复制成功。
scp命令
用于Linux之间复制文件和目录,他是基于shh登录安全的远程文件拷贝命令,rcp是不加密的,而scp是加密的,可以视为是rcp的安全升级版。
语法:scp [-12468Cpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
常用参数:
-
-1:强制scp命令使用协议ssh1
-
-2:强制scp命令使用协议ssh2
-
-4:强制scp命令只使用IPv4寻址
-
-6:强制scp命令只是用IPv6寻址
-
-B:使用批处理模式(传输过程中不询问传输口令或短语)
-
-C:允许压缩
-
-p:保留源文件的修改时间,访问时间和访问权限
-
-q:不显示传输进度条
-
-r:递归赋值整个目录
-
-v:详细方式显示输出
-
-c cipher:以cipher将数据进行加密,这个选项将直接传递给bash
-
-F ssh_config:指定一个替代的shh配置文件,此参数直接传递给shh
-
-i identity_file:从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh
-
-l limit:限定用户所能使用的带宽
-
-P port:指定数据传输使用的端口号
示例: -
复制本地文件到远程:scp /tmp/1.txt root@192.168.85.127:/tmp/1.txt
-
复制本地目录到远程:scp -r /tmp/dir/ root@192.168.85.127:/tmp/dir/
-
复制远程文件到本地:scp root@192.168.85.127:/tmp/1.txt /tmp/1.txt
-
复制远程目录到本地:scp root@192.168.85.127:/tmp/dir /tmp/dir
rm命令
用于删除一个文件或目录。
语法:rm [-ifr] name…
常用参数:
- -i 删除前逐一确认
- -f 即使原档案属性为只读,也直接删除,无需逐一确认
- -r 递归删除
示例:
rm 2.txt,因为文件一旦通过rm命令删除,则无法恢复,所以必须格外小心,大家应该都听过“rm -rf /”这个梗,所以这个命令使用时一定要慎重。
touch命令
用于修改文件或目录的时间属性,包括存取时间和更改时间,若文件不存在,系统则会建立一个新文件,通常我们都是用它来新建文件,修改时间属性倒是用的很少。
语法:touch [-acfm] [-d<日期时间>] [-r<参考文件或目录>] [-t<日期时间>]
常用参数:
- -a 改变文件的读取时间
- -m 改变文件的修改时间
- -c 假如目标档案不存在,不会创建新文件
- -d 指定日期和时间
示例:touch /tmp/2.txt
awk命令
用于文本处理,它拥有强大的文本格式化能力,以空格为默认分隔符进行切片,切开的部分再进行各种分析处理,它支持条件判断、数组、循环等功能,我们可以把它理解为一个脚本语言解释器。awk是由Alfred Aho、Peter Weinberger和Brian Kernighan这三个人创造的,awk就是由三人的首字母组成,我们现在使用的awk其实是gawk,awk目前有akw、nawk和gakw三个版本,不过目前gawk最为常用。这就是你使用man命令查询时,为什么显示的是gawk的原因了。
语法:awk [options] 'pattern+action' file…
内置定义:
- FS 保存或设置字段分隔符
- $n 指定分隔的第n个字段,如$1,$3分别表示第1列,第三列,$0表示当前读入的整行内容
- NF 记录当前处理行的列数
- NR 记录当前处理行的行数
- FNR 当前行在源文件中的行号
- ~ 匹配,可以理解为like
- !~,不匹配,可以理解为 not like
- ==,等于 必须全部相等
- != 不等于
- && 逻辑与
- || 逻辑或
- -F[@ /t :]awk默认以空格作为分隔符,通过-F我们可以指定@、制表符、分号等作为分隔符
示例:
先看一个最简单的,就是我们可以通过 awk '{print}' /tmp/3.txt 输出文件中的内容,不过通常我们会用awk来处理一些命令输出,例如ps -ef命令,我们只想展示第一列的话,可以使用命令如下:
不过ps的内容还是太长了,可能我们只需要看部分数据,那么可以使用命令:
我们可以看到通过NR控制只输出了1到10行的数据,但是我可能并不想查询以root登录的数据,可以使用命令:
这里的“$1”指的是第一列,“!~”表示不包含,/root/是正则,这个时候光看用户我们可能觉得还不够,还想看看是哪个工作进程,顺便加上汉字描述,并且把第一列全部赋值成了“其他用户”:
作为文本处理三剑客,grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文件,对文本进行较复杂格式处理。
grep命令
grep 命令用于查找文件里符合条件的字符串,如果发现文件的内容中有符合所制定的条件,grep就会把符合条件的那一行显示出现。
语法:grep [-abcEFGhHilLnqrsv] [-A<显示行数>][-B<显示行数>][-C<显示行数>][-d<动作>][-e<条件>][-f<条件文本>][文件或目录…]
常用参数:
- -a 不要忽略二进制数据
- -A<显示行数> 除了符合规则的那一行外,还显示该行之后的内容
- -B<显示行数> 除了符合规则的那一行外,还显示该行之前的内容
- -c 计算符合样式的行数
- -C<显示行数> 除了符合规则的那一行外,还显示该行之前和之后的内容
- -d<动作> 当指定要查找的是目录而非文件是,必须使用这项参数
- -e<规则> 指定字符串作为查找规则
- -E 将规则作为正则来使用
- -f<规则文件> 指定规则文件,其内容包含一个或多个规则
- -i 忽略大小写
- -n 显示符合条件的那一行,并标识出那一行的行数编号
示例:对ps的数据进行筛选
例如我们在查看日志文件时,日志文件过大不方便查找时,我们可以使用grep命令来进行查找输出,如:
wc命令
计算文件中的Byte数、字数(对于英文来说一个单词)和列数
语法:wc [-clw]
参数:
- -c 只显示byte数
- -l 只显示行数
- -w 只显示字数
示例:
34 表示行数,31是字数,168是字节数。
useradd命令
useradd命令和adduser命令是同一指令,可用来建立用户账号。
语法:useradd [-mMnr][-c<备注>][-d<登录目录>][-e<有效期限>][-f<缓冲天数>][-g<组群>][-G<组群>][-s
常用参数:
- -c<备注> 加上备注文字,备注文字会保存在password备注栏位中
- -d<登入目录> 指定用户登入时的起始目录
- -D 变更预设值
- -e<有效期限> 指定账号的有效期限
- -f<缓冲天数> 指定在密码过期后多少天即关闭该账号
- -g<组群> 指定用户所属组群
- -G<附加组群> 指定用所属的附加组群
- -m 自动建立用户的登入目录
- -M 不要自动建立用户的登入目录
- -n 取消建立以用户名称为名的组群
- -r 建立系统账号
- -s
指定用户登入后所使用的的shell - -u
指定用户ID
示例:
我们可以通过查看passwd文件来查看当前系统有多少用户
这时我想新增一名用户guest,可以使用命令useradd guest直接创建:
我们使用userdel先将用户guest删除,这是来指定用户组别为root,登入目录为/home/amanda,id为 9527:
那密码怎么设置呢?我们可以使用passwd命令来添加,这个后面会讲到。
userdel 命令
用于删除用户账号。
语法:userdel [-r] [待删除账号]
参数说明:
- -r 删除用户登录目录以及目录中的文件(默认是不删除的)
示例:userdel guest
groupadd命令
用于创建一个新的工作组,新工作组的信息将被添加到系统文件中
语法:groupadd [-g gid [-o]] [-r] [-f] group
常用参数:
- -g:指定新建工作组的id,-o允许添加组ID不唯一的工作组
- -r:创建系统工作组,系统工作组的ID小于500
- -f:如果指定的工作组已存在则仅仅返回成功;当和-g配合使用且指定的GID已存在时,将会选择另一个唯一的GID。
示例:group add guest
groupdel命令
用于删除群组
语法:groupdel [待删除群组]
示例:groupdel guest
groupmod命令
用于更改群组识别码或名称
语法: groupmod [-g <群组识别码> <-o>][-n <新群组名称>][群组名称]
常用参数:
- -g<群组识别码> 设置群组识别码
- -n<新群组名称>
示例:groupmod -n appuser guest
whoami命令
人生三大终极思考之whoami,返回当前用户的名称
who命令
显示目前系统中有哪些使用者,包含使用者ID、终端、上线时间等。
语法: who [-husfv] [user]
常用参数:
- -H:显示栏位标题
- -q:只显示登入系统的账号名和总人数
- -w:显示用户的状态栏
示例:who
usermod命令
用于修改用户账号
语法:usermod[-LU][-c<备注>][-d<登录目录>][-e<有效期限>][-f<缓冲天数>][-g<组群>][-G<组群>][-s
常用参数:
- -L 锁定用户密码,使密码无效
- -l <新名称> 修改账号名称
- -U 解除密码锁定
示例:将之前添加的guest用户分组修改为appuser,usermod guest -g appuser