【Linux】Linux 入门基础知识 『文件管理』
前言
众所周知,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 [选项][目标] |
rmdir
是remove 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 | nl -n ln file.txt |
打印文件前几行
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
命令模糊搜索还是比较消耗系统资源的。
常用选项
选项 | 含义 |
---|---|
:列出结果,使用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 | 将目前目录及其子目录下文件名后缀是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 | locate longfile.txt |
whereis
1 | whereis [选项][命令名] |
whereis
命令用来定位命令的二进制程序、源代码文件和 man
手册页等相关文件的路径。
whereis
命令查找速度非常快,因为它不是在磁盘中乱找,而是在一个数据库中查询; 数据库是linux
系统自动创建的,包含有本地所有文件的信息,并且每天通过自动执行 updatedb
命令更新一次。正因为这样,whereis
命令的搜索结果有时候会不准确,比如刚添加的文件可能搜不到, 原因就是该数据库文件没有被更新。
常用选项
选项 | 含义 |
---|---|
-b | 查找二进制程序或命令 |
-B | 从指定目录下 查找二进制程序或命令 |
-m | 查找man手册文件 |
-M | 从指定目录下 查找man手册文件 |
-s | 只查找源代码文件 |
-S | 从指定目录下 查找源代码文件 |
-u | 查找不包含指定类型的文件 |
-f | 不显示文件名前的路径名称 |
例子
1 | whereis -b passwd |
which
1 | which [参数][目标] |
which
命令的作用是在 PATH
变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
常用选项
选项 | 含义 |
---|---|
-n | 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名 |
-p | 与-n参数相同,但此处的<文件名长度>包括了文件的路径 |
-w | 指定输出时栏位的宽度 |
-V | 显示版本信息 |
例子
查找文件、显示命令路径:
1 | [root@linuxcool ~]# which bash |
说明:which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的!
使用which去找which:
1 | [root@linuxcool ~]# which which |
说明:竟然会有两个 which ,其中一个是 alias 这就是所谓的[命令别名],意思是输入 which 会等于后面接的那串命令! 实Bash内建命令无法查找到如cd命令 :
特殊
1 | [root@linuxcool ~]# which cd |
说明:cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是bash 内建的命令! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的!
查看默认的jdk:
1 | [root@linuxcool ~]# which java |
which查找的目录,PATH变量的值:
1 | [root@linuxcool ~]# echo $PATH |
其他
查看文件树
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
参考:
硬链接和软链接
概念
- 软链接可以类比到 windows 下的快捷方式,源文件删除后,软链接也就同样失效。
- 硬链接可以类比到 java 的垃圾回收机制,创建了一个硬链接后 inode 计数器+1,知道计数器值为 0 后才真正执行回收,系统把这块内存释放。换言之,硬链接实际上就是指向 inode 结构体的指针。
推荐几篇还不错的文章:
ln 命令
ln命令是linux系统中一个非常重要命令,英文全称是“link”,即链接的意思,它的功能是为某一个文件在另外一个位置建立一个同步的链接。
一种是hard link,又称为硬链接;另一种是symbolic link,又称为符号链接。这里的第二种也称位软链接,software link。
符号链接(软链接) :
- 符号链接以路径的形式存在,类似于Windows操作系统中的快捷方式。
- 符号链接可以跨文件系统 ,硬链接不可以。
- 符号链接可以对一个不存在的文件名进行链接,硬链接不可以。
- 符号链接可以对目录进行链接,硬链接不可以。
硬链接:
1.硬链接以文件副本的形式存在,但不占用实际空间。
2. 硬链接不允许给目录创建硬链接。
3.硬链接只有在同一个文件系统中才能创建。
1 | ln [参数] [源文件或目录] [目标文件或目录] |
常用选项
选项 | 含义 |
---|---|
-b | 为每个已存在的目标文件创建备份文件 |
-d | 此选项允许”root”用户建立目录的硬链接 |
-f | 强制创建链接,即使目标文件已经存在 |
-n | 把指向目录的符号链接视为一个普通文件 |
-i | 交互模式,若目标文件已经存在,则提示用户确认进行覆盖 |
-s | 对源文件建立符号链接,而非硬链接 |
-v | 详细信息模式,输出指令的详细执行过程 |
文件权限