1 FHS标准
FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准) 定义了两层规范,第一层是, /
下面的各个目录应该要放什么文件数据,例如 /etc
应该放置设置文件,/bin
与 /sbin
则应该放置可执行文件等等。第二层则是针对 /usr
及 /var
这两个目录的子目录来定义。例如 /var/log
放置系统日志文件,/usr/share
放置共享数据等等。Linux 目录结构如下图所示:
![](https://img-blog.csdnimg.cn/20210305101426485.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hxMTUxNzUwMTEx,size_16,color_FFFFFF,t_70#pic_center)
FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,FHS 依据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用的形态,如下表所示:
可分享的(shareable) | 不可分享的(unshareable) | |||||
---|---|---|---|---|---|---|
|
|
| ||||
|
| |||||
|
| /var/run(程序相关) | ||||
|
|
2 目录路径
使用 cd
命令可以切换目录,在 Linux 里面使用 .
表示当前目录,..
表示上一级目录(以 .
开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用 ls -a 命令查看隐藏文件,或者在主文件夹里面使用 Ctrl+H
快捷键进行查看),-
表示上一次所在目录,~
通常表示当前用户的 home 目录。使用 pwd
命令可以获取当前所在路径(绝对路径)。
3 文件的基本操作
- 终端
Linux中控制电脑的窗口,打开它就可以通过 Linux 命令控制电脑的一切。Linux 中很多操作都需要输入命令来进行,这一点与 Windows 上依靠鼠标操作是不同的,这个输入命令的入口就叫「终端」。
打开一个终端,会默认从当前的用户目录开始操作,这就好比打开“我的电脑”,会默认显示所有磁盘的目录。如下:
shiyanlou:~/ $
shiyanlou
代表当前用户名,后面的 $
是命令提示符,提示你:请在后面输入命令。常见的提示符主要有 #
、$
、~
等,#
提示符表示当前用户为系统超级管理员用户,即root用户,拥有最高管理权限。$
提示符表示当前用户为普通用户,只有一定的管理权限。
- touch新建空白文件
- 语法:touch [参数] [文件名]
如果【文件名】所对应的文件不存在,将创建一个同名的新文件;如果该文件已经存在,则修改这个文件的最后修改日期。
参数 | 含义 |
---|---|
-a | 只更改存取时间 |
-c | 不建立任何文件 |
-d<时间日期> | 使用指定的日期时间 |
-m | 只更改变动时间 |
-r<参考文件或目录> | 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同 |
-t<日期时间> | 使用指定的日期时间 |
–help | 在线帮助 |
–version | 显示版本信息 |
$ touch file
- mkdir新建目录
- 语法:touch [参数] [文件名]
- 参数
-p
若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录。
Linux 的目录类似于 Windows 系统中的文件夹
$ mkdir -p father/son/grandson # 使用 -p 参数,同时创建父目录(如果不存在该父目录)
- cp复制文件
- 语法:cp [参数] [源地址] [目的地址]
参数 | 含义 |
---|---|
-a | 此参数效果和同时指定“-dpR”参数相同 |
-d | 当复制符号连接时,将保留原始的链接 |
-f | 强制复制文件或目录,不论目标文件或目录是否已存在 |
-i | 覆盖既有文件之前先询问用户 |
-l | 对源文件建立硬连接,而非复制文件 |
-p | 保留源文件或目录的属性 |
-r | 递归处理,将指定目录下的文件与子目录一并处理 |
-R | 递归处理,将指定目录下的所有文件与子目录一并处理 |
-s | 对源文件建立符号连接,而非复制文件 |
-v | 显示指令执行过程 |
$ cp 1.txt father/son/grandson
- cp复制目录
$ cp -r father family # 要成功复制目录需要加上 -r 或者 -R 参数,表示递归复制,就是说有点“株连九族”的意思
- rm删除文件
- 语法:touch [参数] [文件名]
参数 | 含义 |
---|---|
-d | 直接把欲删除的目录的硬连接数据删成0,删除该目录 |
-f | 强制删除文件或目录 |
-i | 删除既有文件或目录之前先询问用户 |
-r | 递归处理,将指定目录下的所有文件及子目录一并处理 |
-v | 显示指令执行过程 |
$ rm test # 有时候你会遇到想要删除一些为只读权限的文件,直接使用 rm 删除会显示一个提示,可以使用 -f 参数强制删除
- rm删除目录
$ rm -f family # 不要轻易使用<rm -rf 目录>,这样会连同根目录也删除
- mv移动文件
- 语法:mv [参数] [源地址] [目的地址]
参数 | 含义 |
---|---|
-b | 若需覆盖文件,覆盖前先备份 |
-f | 若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录 |
-i | 覆盖前先行询问用户 |
-v | 执行时显示详细信息 |
$ mv file document
- rename重命名文件
- 语法:touch [参数] [文件名]
mv
——单个文件移动,rename
——实现批量重命名
$ mv file1 myfile # mv 命令除了能移动文件外,还能给文件重命名。命令格式为 mv 旧的文件名 新的文件名
$ touch file{1..5}.txt # 使用通配符批量创建 5 个文件
$ rename 's/\.txt/\.c/' *.txt # 批量将这 5 个后缀为 .txt 的文本文件重命名为以 .c 为后缀的文件
$ rename 'y/a-z/A-Z/' *.c # 批量将这 5 个文件,文件名和后缀改为大写:
# rename 命令并不是内置命令,若提示无该命令可以使用 sudo apt-get install rename 命令自行安装。
- 查看文件内容
-
使用
cat
,tac
和nl
命令查看文件
前两个命令都是用来打印文件内容到标准输出(终端),其中cat
为正序显示,tac
为倒序显示。
nl
命令,添加行号并打印,这是个比cat -n
更专业的行号打印命令。 -
使用
more
和less
命令分页查看文件
打开后默认只显示一屏内容,终端底部显示当前阅读的进度。可以使用 Enter 键向下滚动一行,使用 Space 键向下滚动一屏,按下 h 显示帮助,q 退出。
语法:more [参数] [文件名]
参数 | 含义 |
---|---|
-p | 在显示下一屏之前清屏 |
-d | 在每一屏的底部显示友好信息 |
-s | 文件中连续的空白行压缩为一行 |
-num | 为每屏要求显示的行数 |
$ more 1.txt
- 使用 head 和 tail 命令查看文件
head命令用于显示一个文件的前面几行或前面几个字节;tail命令用于显示一个文件的最后几行或几个字节。
语法:head/tail [参数] [文件名]
参数 | 含义 |
---|---|
-c num | 显示最后num个字节 |
-num | 显示最后num行,若缺省,则显示10行 |
- 查看文件类型
在Linux中文件可以没有扩展名,是否具备某种属性,主要取决于文件的属性和类型。在Ubuntu Linux中主要有以下文件类型:
参数 | 含义 |
---|---|
- | 普通文件,通常是被一些应用程序创建的,如文档、图片等 |
d | 目录,可以包含多个目录,也可以归属于其他目录 |
c | 字符设备,串口设备,比如调制解调器等 |
b | 块设备,存储数据以供系统存取的接口设备,比如硬盘、光驱等 |
l | 符号链接文件,相当于一个快捷方式,指向目标文件 |
s | 套接口文件,用于网络通信的文件 |
p | 管道文件,主要指FIFO文件,即先入先出模式的管道文件,这是一种进程间通信机制 |
file命令查看文件的类型
- 语法:file [参数] [文件名]
参数 | 含义 |
---|---|
-b | 列出辨识结果时,不显示文件名称 |
-c | 详细显示指令执行过程,便于排错或分析程序执行的情形 |
-L | 直接显示符号连接所指向的文件的类别 |
-v | 显示版本信息 |
- 编辑文件
在 Linux 下面编辑文件通常我们会直接使用专门的命令行编辑器比如(emacs
,vim
,nano
)。
$ vim hello.py
- 查询文件
- find命令用于在目录结构中查询文件
- 语法:find [路径] [参数] [关键字]
- 说明:路径表示要查找的目录结构,如果缺省,则表示查找路径为当前目录;关键字可以是文件名的一部分。
参数 | 含义 |
---|---|
-ctime <24小时数> | 查找在指定时间内被修改的得文件或目录,单位以24小时计算 |
-depth | 从指定目录下最深层的子目录开始查找 |
-gid <群组识别码> | 查找符合指定的群组识别码的文件或目录 |
-group <群组名称> | 查找符合指定的群组名称的文件或目录 |
-name filename | 查找与filename字符串匹配的文件或目录,可使用通配符 |
-size <文件大小> | 查找符合指定的文件大小的文件 |
-typ <文件类型> | 查找符合指定的文件类型的文件 |
-uid <用户识别码> | 查找符合指定的用户识别码的文件或目录 |
-used <天数> | 查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以天计算 |
-user <拥有者名称> | 查找符合指定的拥有者名称的文件或目录 |
- locate指令用于查找符合条件的文件
- 语法:locate [参数] [关键字]
参数 | 含义 |
---|---|
-d <数据库文件> | 设置locate指令使用的数据库,取代默认的数据库 |
-w | 匹配整个路径 |
-c | 只显示找到的条目数量 |
- grep查找内容包含指定的关键字的文件
- 语法:grep [参数] 关键字 文件列表
- 说明:grep命令一次只能查找一个关键字,但文件列表可以包含多个文件。
| 参数 | 含义 |
|----|---------------|
| -i | 忽略字符大小写的差别 |
| -v | 反转查找,只显示不匹配的行 |
| -x | 只显示整行严格匹配的行 |
| -r | 在指定目录中递归查找 |
4 文件权限
Linux 系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。这也是 Linux 有别于 Windows 的机制,也是基于这个权限机制,Linux 可以有效防止病毒自我运行,因为运行的条件是必须要有运行的权限,而这个权限在 Linux 是用户所赋予的。
Linux的文件权限有以下设定:
- Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。
- Linux下权限的属组有 拥有者(User) 、群组(Group) 、其它组(Other) 三种。每个文件都可以针对这三个属组(粒度),设置不同的rwx(读写执行)权限。
- 通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。
- 查看文件权限
Linux ls(英文全拼:list files)命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。
使用 usermod
命令可以为用户添加用户组,同样使用该命令你必需有 root 权限,你可以直接使用 root 用户为其它用户添加用户组,或者用其它已经在 sudo 用户组的用户使用 sudo
命令获取权限来执行该命令。
sudo usermod -G sudo lilei # 将其他用用户加入sudo用户组
sudo chown shiyanlou 1.txtx # 变更文件所有者
echo "echo \"hello shiyanlou\"" > 1.txt # 文件里面添加内容
chmod 600 iphone11 ls -alh 1.txt # 修改文件权限
- 修改文件权限
- 方式一:二进制数字表示
rwx
——每个文件有三组固定的权限,分别对应拥有者,所属用户组,其他用户,这个顺序是固定的。。 首先,我们规定 数字 4 、2 和 1表示读、写、执行权限(具体原因可见下节权限详解内容),即 r=4,w=2,x=1 。此时其他的权限组合也可以用其他的八进制数字表示出来,
- 若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7
- 若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6
- 若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5
每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。即我们可以用用三个8进制数字分别表示 拥有者 、群组 、其它组( u、 g 、o) 的权限详情,并用chmod直接加三个8进制数字的方式直接改变文件权限。
chmod 600 iphone11
- 方式二:加减赋值操作
chmod go-rw iphone11
# + 和 - 分别表示增加和去掉相应的权限。
常见的权限形式有:
-rw------- (600) 只有拥有者有读写权限。
-rw-r--r-- (644) 只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) 只有拥有者有读、写、执行权限。
-rwxr-xr-x (755) 拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711) 拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) 所有用户都有文件读、写权限。
-rwxrwxrwx (777) 所有用户都有读、写、执行权限。
5 帮助命令
内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在 bash 源码的 builtins 里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。
外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin 等等。比如:ls、vi 等。
help
、man
命令
help ls
ls --help
man ls
info ls