前言

众所周知,Linux 中有个抽象的概念–文件。何为文件?通俗意义讲就是用来存储信息的媒介,而在计算机中,系统把一块块物理内存映射到虚拟内存,再利用这块内存存储对应的信息,这块内存经由 Linux 抽象成文件的概念,实际上就是 Linux 用来存储信息的媒介,我们通过这个抽象实体,就可以在软件层面管理这些信息。

需要特别注意的是,在 Windows 中,文件一般指用户能操作的东西,对于驱动、网卡等系统级的设备不全能通过我们操作文件的形式去改动它;而在 Linux 中,无论是设备还是驱动、网卡等,统统被抽象成文件,因此,我们掌握了 Linux 中文件的管理方式,就能更进阶地去操作系统级的东西。

本文主要介绍在 Linux 中,文件管理的基础命令以及软链接、硬链接等文件相关的概念。

快速开始

目录文件管理

创建目录

1
mkdir [参数] [目录]

mkdir命令是『make directories』的缩写,用来创建目录。

常用选项

选项 含义
-p 递归创建多级目录
-m 建立目录的同时设置目录的权限
-z 设置安全上下文
-v 显示目录的创建过程

切换目录

1
cd [参数] [目录名]

cd 命令是『change directory』中单词的首字母缩写,其英文释义是改变目录,所以该命令的功能是从当前目录切换到指定目录。

常用选项

选项 含义
-P 如果切换的目标目录是一个符号链接,则直接切换到符号链接指向的目标目录
-L 如果切换的目标目录是一个符号链接,则直接切换到符号链接名所在的目录
仅使用『-』选项时,当前目录将被切换到环境变量『OLDPWD』对应值的目录
~ 切换至当前用户目录
.. 切换至当前目录位置的上一级目录

查看目录列表

1
ls [参数][目录名]

ls 命令为英文单词 list 的缩写,正如英文单词 list 的意思,其功能是列出指定目录下的内容及其相关属性信息。

常用选项

选项 含义
-a 显示所有文件及目录 (包括以”.”开头的隐藏文件)
-l 使用长格式列出文件及目录信息
-r 将文件以相反次序显示(默认依英文字母次序)
-t 根据最后的修改时间排序
-A 同 -a ,但不列出 “.” (当前目录) 及 “..” (父目录)
-S 根据文件大小排序
-R 递归列出所有子目录

显示当前路径

1
pwd [参数]

常用选项

选项 含义
-L 显示逻辑路径

删除空的目录

1
rmdir [选项][目标]

rmdirremove directory 是的首字母缩写。

注意rmdir 命令只能删除空目录。当要删除非空目录时,就要使用带有『-R』选项的 rm命令。
rmdir 命令的『-p』参数可以递归删除指定的多级目录,但是要求每个目录也必须是空目录。

常用选项

选项 含义
-p 用递归的方式删除指定的目录路径中的所有父级目录,非空则报错
– – ignore-fail-on-non-empty 忽略由于删除非空目录时导致命令出错而产生的错误信息
-v 显示命令的详细执行过程
– – help 显示命令的帮助信息
– – version 显示命令的版本信息

文件管理

创建新文件

1
touch [选项][目标]

touch 命令有两个功能:一是创建新的空文件,二是改变已有文件的时间戳属性。

touch 命令会根据当前的系统时间更新指定文件的访问时间和修改时间。

如果文件不存在,将会创建新的空文件,除非指定了”-c”或”-h”选项。

注意:在修改文件的时间属性的时候,用户必须是文件的属主,或拥有写文件的访问权限。

常用选项

选项 含义
-a 改变档案的读取时间记录
-m 改变档案的修改时间记录
-r 使用参考档的时间记录,与 –file 的效果一样
-c 不创建新文件
-d 设定时间与日期,可以使用各种不同的格式
-t 设定档案的时间记录,格式与 date 命令相同
–no-create 不创建新文件
–help 显示帮助信息
–version 列出版本讯息
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题

移动文件 or 修改文件名

1
mv [选项][源文件][目标文件]

mv 命令是『move』单词的缩写,其功能大致和英文含义一样,可以移动文件或对其改名

常用选项

选项 含义
-i 若存在同名文件,则向用户询问是否覆盖
-f 覆盖已有文件时,不进行任何提示
-b 当文件存在时,覆盖前为其创建一个备份
-u 当源文件比目标文件新,或者目标文件不存在时,才执行移动此操作

拷贝文件

1
cp [选项][源文件][目标文件]

cp 命令可以理解为英文单词 copy 的缩写,其功能为复制文件或目录。

cp 命令可以同时复制多个文件到一个指定的目录中。

常用选项

选项 含义
-f 若目标文件已存在,则会直接覆盖原文件
-i 若目标文件已存在,则会询问是否覆盖
-p 保留源文件或目录的所有属性
-r 递归复制文件和目录
-d 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录
-l 对源文件建立硬连接,而非复制文件
-s 对源文件建立符号连接,而非复制文件
-b 覆盖已存在的文件目标前将目标文件备份
-v 详细显示cp命令执行的操作过程
-a 等价于”dpr”选项

移除文件 or 移除目录

1
rm [选项][目标]

rm 命令的是单词 remove 的缩写,表示移除。

常用选项

选项 含义
-f 忽略不存在的文件,不会出现警告信息
-i 删除前会询问用户是否操作
-r/R 递归删除
-v 显示指令的详细执行过程

文本文件操作

  • cat 由第一行开始显示文件内容

  • tac 从最后一行开始显示文本内容

  • nl 显示文本内容同时输出行号

  • more 一页一页的显示文件内容

  • less 与 more 类似,但可以向前翻页

  • head 只看头几行

  • tail 只看末端几行

从头到尾-文本查看 cat

1
cat [选项][目标]

一般使用于小文件,当文件内容较大时,文本内容会在屏幕上快速闪动(滚屏),用户往往看不清所显示的具体内容。因此对于较长文件内容可以按Ctrl+S键,停止滚屏;以及Ctrl+Q键可以恢复滚屏;而按Ctrl+C(中断)键则可以终止该命令的执行。

对于大文件一般用more

常用选项

选项 含义
-n 显示行数(空行也编号)
-s 显示行数(多个空行算一个编号)
-b 显示行数(空行不编号)
-E 每行结束处显示$符号
-T 将TAB字符显示为 ^I符号
-v 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
-e 等价于”-vE”组合
-t 等价于”-vT”组合
-A 等价于 -vET组合
–help 显示帮助信息
–version 显示版本信息

从尾到头-文本查看 tac

1
tac [选项][目标]

cat 正好相反,从文本尾部按行往前输出

常用选项

选项 含义
-b 在行前而非行尾添加分隔标志
-r 将分隔标志视作正则表达式来解析
-s 使用指定字符串代替换行作为分隔标志
–version 显示版本信息并退出
–help 显示此帮助信息并退出

查看大文本 more

1
more [选项][目标]

用于打开一个文件的浏览程序,按 q 退出

程序内部操作

  • Space键:显示文本的下一屏内容
  • Enter键:向下n行,需要定义,默认为1行
  • 斜线符\:接着输入一个模式,可以在文本中寻找下一个相匹配的模式
  • H键:显示帮助屏
  • B键:显示上一屏内容
  • Q键:退出more命令
  • Ctrl+F、空格键:向下滚动一屏
  • Ctrl+B:返回上一屏
  • =: 输出当前的行号
  • :f:输出文件名和当前的行号
  • V:调用vi编辑器
  • !:调用Shell,并执行命令

常用选项:

选项 含义
-num 指定每屏显示的行数
-lmore 在通常情况下把 ^L 当作特殊字符, 遇到这个字符就会暂停,-l选项可以阻止这种特性
-f 计算实际的行数,而非自动换行的行数
-p 先清除屏幕再显示文本文件的剩余内容
-c 与-p相似,不滚屏,先显示内容再清除旧内容
-s 多个空行压缩成一行显示
-u 禁止下划线
+/pattern 在每个文档显示前搜寻该字(pattern),然后从该字串之后开始显示
+num 从第 num 行开始显示

查看大文本 less

1
less [选项][目标]

功能和 more 相似,只不过 less 多了上滚和下滚的操作

程序内部操作

  • b 向后翻一页
  • d 向后翻半页
  • h 显示帮助界面
  • Q 退出less 命令
  • u 向前滚动半页
  • y 向前滚动一行
  • 空格键 滚动一页
  • 回车键 滚动一行

常用选项

选项 含义
-b 置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 在单行显示较长的内容,而不换行显示
-x 将TAB字符显示为指定个数的空格字符

行号计算工具 nl

1
nl [选项][目标]

nl 命令在linux 系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。

常用选项

选项 含义
-b 指定行号指定的方式
-n 列出行号表示的方式
-w 行号栏位的占用的位数
-p 在逻辑定界符处不重新开始计算。

例子:

1
2
3
4
5
6
7
8
9
$ nl -n ln file.txt
1 linux
2 Windows
3 Mac OS

$ nl -n rz file.txt
000001 linux
000002 Windows
000003 Mac OS

打印文件前几行

1
head [选项][目标]

常用选项

选项 含义
-n 后面接数字,代表显示几行的意思
-c 指定显示头部内容的字符数
-v 总是显示文件名的头信息
-q 不显示文件名的头信息

打印文件后几行

1
tail [选项][目标]

故名思议,和 head 命令是一组对称命令。

常用选项

选项 含义
–retry 即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项”–follow=name”连用
-c <N>或 –bytes= <N> 输出文件尾部的N(N为整数)个字节内容
-f <name/descriptor>--follow<nameldescript>:显示文件最新追加的内容
-F 与选项”-follow=name”和”–retry”连用时功能相同
-n <N>或–line=<N>输出文件的尾部N(N位数字)行内容
–pid <进程号>与”-f”选项连用,当指定的进程号的进程终止后,自动退出 tail 命令
–help 显示指令的帮助信息
–version 显示指令的版本信息

文本文件合并

1
paste [参数] [目标1] [目标2]

paste 命令会把每个文件以列对列的方式,一列列地加以合并 ,他就是相当于把两个不同的文件内容粘贴在一起,形成新的文件。

paste默认粘贴方式以列的方式粘贴,加上 -s 选项就可以行方式粘贴

常用选项

选项 含义
-d 默认域的分隔符是空格或tab键,设置新的域分隔符
-s 将每个文件粘贴成一行
从标准输入中读取数据

文本处理三剑客 grep sed awk

grep

grep是“global search regular expression and print out the line”的简称,意思是全面搜索正则表达式,并将其打印出来。这个命令可以结合正则表达式使用。

注意:一当模式中包含了空格,务必要用双引号将其引起来。

linux 系统支持三种形式的 grep 命令,大儿子就是 grep ,标准,模仿的代表。二儿子兴趣爱好多-egrep,简称扩展grep命令,其实和grep -E等价,支持基本和扩展的正则表达式。小儿子跑的最快-fgrep,简称快速grep命令,其实和grep -F等价,不支持正则表达式,按照字符串表面意思进行匹配。

常用选项

选项 含义
-i 搜索时,忽略大小写
-c 只输出匹配行的数量
-l 只列出符合匹配的文件名,不列出具体的匹配行
-n 列出所有的匹配行,显示行号
-h 查询多文件时不显示文件名
-s 不显示不存在、没有匹配文本的错误信息
-v 显示不包含匹配文本的所有行
-w 匹配整词
-x 匹配整行
-r 递归搜索
-q 禁止输出任何结果,已退出状态表示搜索是否成功
-b 打印匹配行距文件头部的偏移量,以字节为单位
-o 与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位

sed

Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

常用选项

选项 含义
-e 或–expression=<script>以选项中指定的script来处理输入的文本文件
-f <script文件>--file=<script文件>以选项中指定的script文件来处理输入的文本文件
-h 或–help显示帮助
-n 或–quiet或–silent仅显示script处理后的结果
-V 或–version显示版本信息

awk

awk 命令是一种编程语言,用于在 linux/unix 下对文本和数据进行处理。

而且它支持用户自定义函数和动态正则表达式等先进功能,是 linux/unix 下的一个强大编程工具。

常用选项

选项 含义
-F 指定输入时用到的字段分隔符
-v 自定义变量
-f 从脚本中读取awk命令
-m 对val值设置内在限制

文件搜索

find

1
find [选项][目标]

find 命令可以根据给定的路径和表达式查找的文件或目录。find 参数选项很多,并且支持正则,功能强大。和管道结合使用可以实现复杂的功能。

注意find 如不加任何参数,表示查找当前路径下的所有文件和目录,如果服务器负载比较高尽量不要在高峰期使用find 命令,find 命令模糊搜索还是比较消耗系统资源的。

常用选项

选项 含义
-print :列出结果,使用find命令,默认执行
-mtime n :文件修改时间,对文件数据的最近一次修改是在 n*24 小时之前
-mmin n :对文件数据的最近一次修改是在 n 分钟之前
-ctime n :文件状修改时间,对文件状态的最近一次修改是在 n*24 小时之前。
-cmin n :件状态修改,对文件状态的最近一次修改是在 n 分钟之前。
-atime n :访问时间,对文件的最近一次访问是在 n*24 小时之前。
-amin n :最后访问时间,对文件的最近一次访问是在 n 分钟之前。
-mtime : 指定时间曾被改动过的文件,意思是文件內容被更改过
-ctime : 指定时间曾被更改过的文件,意思是文件权限被更改过
-atime : 指定时间曾被存取过的文件,意思是文件被读取过
-newer file :file为已存在的文件,意为列出比file时间更新的文件
-type :指定文件类型
-uid n :指定文件属主uid
-gid n :指定文件属组gid
-user :指定文件属主名
-group :指定文件属组名
-nouser : 查找系统中没有属主的文件
-nogroup :查找系统中没有属组的文件
-name :查找文件名相匹配的文件
-size :查找匹配大小的文件
-exec COMMAND :查找后使用额外命令处理查找结果
-perm +mode -mode
-size 按大小查找
-iname 忽略大小写

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#将目前目录及其子目录下文件名后缀是txt的文件列出来
$ find . -name "*.txt"
./file.txt
./longfile.txt
./text-grep/file.txt
./text-grep/longfile.txt
............省略...........

#将当前目录及其子目录下所有目录列出
$ find . -type d
.
./.ipython
./.ipython/extensions
./.ipython/profile_default
............省略...........

#查找当前目录下20分钟内被访问过的文件或目录:
$ find . -amin -20
.
./.local/share/jupyter/nbsignatures.db
./user
./linux8.ipynb

#查找当前目录下大于10k的普通文件,并列出其详细信息
$ find . -size +10k -type f
./.ipython/profile_default/history.sqlite
./privilege_1.png
./linux5_5.png
./linux5_2.png

#找出/home下不是以.txt结尾的文件:

$ find /home ! -name "*.txt"

locate

1
locate [选项][目标]

locate 命令其实是find -name 的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb ,值得注意的是:版本不同,会有所不同。有的版本位置是/var/lib/mlocate/mlocatedb ,还有的是/var/lib/slocate/slocate.db ,这个数据库中含有本地所有文件信息。

Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用 locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,先使用 updatedb 命令,手动更新数据库

常用选项

选项 含义
-d <目录>或–database=<目录>指定数据库所在的目录
–help 显示帮助
–version 显示版本信息

例子

1
2
3
4
5
6
7
8
$ locate longfile.txt
/home/jovyan/compress/dir/longfile.txt
/home/jovyan/compress/longfile.txt
/home/jovyan/dirandfile/longfile.txt
/home/jovyan/longfile.txt
/home/jovyan/text-grep/longfile.txt
/home/jovyan/text-sed/longfile.txt
/home/jovyan/text-vi/longfile.txt

whereis

1
whereis [选项][命令名]

whereis 命令用来定位命令的二进制程序、源代码文件和 man 手册页等相关文件的路径。

whereis 命令查找速度非常快,因为它不是在磁盘中乱找,而是在一个数据库中查询; 数据库是linux 系统自动创建的,包含有本地所有文件的信息,并且每天通过自动执行 updatedb 命令更新一次。正因为这样,whereis 命令的搜索结果有时候会不准确,比如刚添加的文件可能搜不到, 原因就是该数据库文件没有被更新。

常用选项

选项 含义
-b 查找二进制程序或命令
-B 从指定目录下 查找二进制程序或命令
-m 查找man手册文件
-M 从指定目录下 查找man手册文件
-s 只查找源代码文件
-S 从指定目录下 查找源代码文件
-u 查找不包含指定类型的文件
-f 不显示文件名前的路径名称

例子

1
2
$ whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd

which

1
which [参数][目标]

which 命令的作用是在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。

常用选项

选项 含义
-n 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名
-p 与-n参数相同,但此处的<文件名长度>包括了文件的路径
-w 指定输出时栏位的宽度
-V 显示版本信息

例子

查找文件、显示命令路径:
1
2
3
4
[root@linuxcool ~]# which bash
/bin/bash
[root@linuxcool ~]# which adduser
/usr/sbin/adduser

说明:which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的!

使用which去找which:
1
2
[root@linuxcool ~]# which which 
alias which='alias|/usr/bin/which --tty-only --read-alias --show-dot --show-tilde'/usr/bin/which

说明:竟然会有两个 which ,其中一个是 alias 这就是所谓的[命令别名],意思是输入 which 会等于后面接的那串命令! 实Bash内建命令无法查找到如cd命令 :

特殊
1
[root@linuxcool ~]# which cd

说明:cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是bash 内建的命令! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的!

查看默认的jdk:
1
2
[root@linuxcool ~]# which java
/usr/bin/java
which查找的目录,PATH变量的值:
1
2
[root@linuxcool ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

其他

查看文件树

1
tree [选项][目标]

tree 命令的全称即是『tree』,该命令作用是用于以树状图形式列出目录的内容。 执行 tree 命令,它会以树状图的方式列出指定目录下的所有文件,包括目录里的文件,显示出指定目录的文件目录结构。

常用选项

选项 含义
-a 显示所有文件和目录
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合
-C 在文件和目录清单加上色彩,便于区分这种类型
-d 显示目录名称而非内容
-D 列出文件或目录的更改时间
-f 在每个文件或目录之前,显示完整的相对路径名称
-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*“,”/“,”=”,”@”,”
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码
-i 不以阶梯状列出文件或目录名称
-I <范本样式>不显示符合范本样式的文件或目录名称
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录
-n 不在文件和目录清单上加上色彩
-N 直接列出文件和目录名称,包括控制字符
-p 列出权限标示
-P <范本样式>只显示符合范本像是的文件或目录名称
-q 用”?”号取代控制字符,列出文件和目录名称
-s 列出文件或目录大小
-t 用文件和目录的更改时间排序
-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码
-x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外
-L 层级显示

同理,pstree 可以显示进程的树形结构。

单引号、双引号、反引号的区别

单引号:串内部原样输出,不引用和替换
双引号:内部如果有变量则输出变量的值,可替换 $ 和 反引号 的内容
反引号:支持命令的替换,把命令部分替换成命令输出的结果

防火墙部分 ufw

参考:

  1. Ubuntu 20.04防火墙 UFW做NAT转换,IP伪装,端口重定向,端口映射

  2. firewalld使用

硬链接和软链接

概念

  • 软链接可以类比到 windows 下的快捷方式,源文件删除后,软链接也就同样失效。
  • 硬链接可以类比到 java 的垃圾回收机制,创建了一个硬链接后 inode 计数器+1,知道计数器值为 0 后才真正执行回收,系统把这块内存释放。换言之,硬链接实际上就是指向 inode 结构体的指针。

推荐几篇还不错的文章

  1. ln - 软链接与硬链接区别
  2. 硬链接为什么不能跨目录和文件系统

ln 命令

ln命令是linux系统中一个非常重要命令,英文全称是“link”,即链接的意思,它的功能是为某一个文件在另外一个位置建立一个同步的链接。

一种是hard link,又称为硬链接;另一种是symbolic link,又称为符号链接。这里的第二种也称位软链接,software link

符号链接(软链接)

  1. 符号链接以路径的形式存在,类似于Windows操作系统中的快捷方式。
  2. 符号链接可以跨文件系统 ,硬链接不可以。
  3. 符号链接可以对一个不存在的文件名进行链接,硬链接不可以。
  4. 符号链接可以对目录进行链接,硬链接不可以。

硬链接

1.硬链接以文件副本的形式存在,但不占用实际空间。
2. 硬链接不允许给目录创建硬链接。
3.硬链接只有在同一个文件系统中才能创建。

1
ln [参数] [源文件或目录] [目标文件或目录]
常用选项
选项 含义
-b 为每个已存在的目标文件创建备份文件
-d 此选项允许”root”用户建立目录的硬链接
-f 强制创建链接,即使目标文件已经存在
-n 把指向目录的符号链接视为一个普通文件
-i 交互模式,若目标文件已经存在,则提示用户确认进行覆盖
-s 对源文件建立符号链接,而非硬链接
-v 详细信息模式,输出指令的详细执行过程

文件权限

后记

参考文章

  1. Linux命令大全(手册)
  2. 文本处理三剑客
  3. ln - 软链接与硬链接区别