# Linux 命令
# 1. 文件类型
注意
Linux 中不以文件的后缀名来标识文件类型。
Linux 文件文件类型一共就只有 7 种,大体上它们可以分成 3 类:普通文件、目录 和 伪文件。
# 普通文件
普通文件,也叫常规文件。
是大多数人在使用『文件』这个词时所指的文件。普通文件包含数据,位于某种类型的存储设备上。普通文件就是大多数情况下你所需要的文件类型。
普通文件又细分为 2 种类型:
文本文件
文本文件包含的数据内容是可显示的字符和每行末尾的换行符。文本文件用于存储文本数据:纯文本、源代码、配置文件等。
二进制文件
二进制文件包含非文本数据,这种类型的数据只有在执行或者由其他程序解释时才有意义。常见的二进制文件包含可执行文件、图像、音视频文件、字处理文档、数据库等。
例如
,文本编辑器程序是一个二进制文件,而用文本编辑器编辑的文件是文本文件。
# 目录
目录,和普通文件相似,目录也驻留在某种类型的存储设备上。但是,目录不存放常规数据。它们被用来组织、访问其他文件。从概念上讲,目录中『包含』其他文件。
目录中可以包含其他目录。这样就可以按层次结构系统地组织文件。整个 Linux 文件系统就是被组织成一个大的 层次结构。
# 伪文件
伪文件 是其他 5 种文件的总称,与普通文件和目录不同,伪文件并不用来存储数据。
对于我们而言,最常见的 5 种伪文件之一就是 链接(link)。
# 总结
当听到或看到 "文件" 这个单词时,必须根据上下文来理解它的含义。
有时候,它指任意一种类型的文件,俗称 广义上 的文件;
有时候它只指包含数据的文件,即普通文件,俗称 狭义上 的文件。
# 2. 目录和子目录
Linux 使用目录将文件组织成一个类似族谱的 树型 的层次结构。
父目录 是包含其他目录的目录。子目录 是位于另一个目录中的目录。
一个目录在整个层次结构中拥有『两种身份』:它即使某些目录的父目录,同时它也是某个目录的子目录。
在文件系统中,目录基于一个被称为 根目录 的目录,而组织成树型结构。
除了根目录之外,所有的目录都位于另一个目录之内。因此,除了根目录,所有的目录都是子目录。
根目录的名字是固定的:/
。
为了表示一个目录或者文件,位于另一个目录之中,需要使用一个 /
将名称 分隔。
例如
,在 /bin
目录中,有一个叫 ls
的文件,这个文件的正式名称就是 /bin/ls
。
字符 /
可能会产生混淆,因为 /
拥有两层含义:
在文件名的开头,
/
代表根目录。在文件名的中间,
/
充当分隔符。
# 3. home 目录
作为多用户系统,Linux 不允许各个用户随意地将文件想放在哪就放在哪,而是为每个用户提供一个家目录,这是一个可以任由用户自己处理的目录。
至于其它的位置你是否有权利存放文件,那就要看『情况』了。
当创建 Linux 用户(账户)时,系统就会自动地为该用户创建一个家目录。当登陆时,系统将自动地将你置于这个目录中。
作为快捷方法,符号 ~
可以用作各个用户家目录的缩写。
# 4. 路径名与工作目录
路径名,顾名思义指的就是 带路径的文件名 。路径名才是一个文件真正的完整的名称。
书写文件的路径名:首先是一个 /
字符,该字符代表根目录。然后是到达文件途经的所有目录名,每一个目录名后面跟一个 /
,最后是文件名。
任意时刻,用户一定是处于某个目录下的,此目录称为 当前目录
,也叫 工作目录
,有时也叫 当前工作目录
。
我个人习惯性称作
当前工作目录
。
每当希望使用工作目录中的文件时,无需指定整个路径,只需输入文件名即可。
当使用以
/
开头的名称时,Linux 认为这个名称是一个完整的路径名,从根目录开始;当没有以
/
开头时,Linux 认为这是工作目录中的文件。
每次登陆时,Linux 自动将工作目录设置为登录用户的家目录。 在工作过程中,可以在需要时使用 cd
命令改变工作目录。
# 5. 绝对路径名与相对路径名
从根目录开始,描述一个文件的访问路径及文件名,称为 绝对路径名。
从当前目录开始,描述一个文件的访问路径及文件名,称为 相对路径。
简单来说,绝对路径名以 /
开头;凡不以 /
开头的路径名都是相对路径。
Linux 提供了 3 种便利的路径名缩写:..
、.
和 ~
。
当在路径名中使用 ..
时,它指的是父目录;
一个单独的 .
指的是工作目录本身。
任何不以 /
开头的路径名都被认为,是从工作目录开始的路径名 。
在 Linux 中,文件名的第一个字符是 .
,则文件为 隐藏文件 。
# 6. 在目录树中移动:cd、pwd
pwd,print working directory,显示工作目录的名称。
语法:
pwd
cd,change directory,切换工作目录
语法:
cd [directory]
directory 是希望切换到的目录的名称。
cd 默认情况下,即没有参数的情况下,将切换到家目录。否则就是切换到参数所指定的目录。
# 7. 最重要的程序:ls
ls,list files,按字母表顺序显示目录中各文件的名称。
语法:
ls [-1lRa] [name ...]
其中 name 是目录或文件的名称。
如果不指定目录,那么 ls 显示工作目录中的文件,此时 ls
和 ls .
等价。
ls -l xxxxx
以长格式(详细格式)显示文件信息
类型标记 | 说明 |
---|---|
- | 普通文件 |
d | 目录 |
l | 符号连接 |
b | 块设备 |
c | 字符设备 |
p | 有名管道 |
s | socket 文件 |
ls -a xxxx
显示文件,包括隐藏文件。
ls -R xxxxx
列举指定目录中的所有直接和间接的子目录和文件信息。
# 8. 创建目录:mkdir
语法:
mkdir <dirpath> ...
# 9. 创建文件:touch
语法:
touch <filepath> ...
touch 命令的本意本来不是用来建文件的,不过 touch 命令有一个“副作用”,如果一个文件不存在,则使用 touch 命令可以新建这个文件。
如果一个文件已存在,touch 命令不会重新新建。
# 10. 文件权限
普通文件
标志 | 说明 |
---|---|
r | 读取文件 |
w | 写入文件 |
x | 执行文件 |
目录
标志 | 说明 |
---|---|
r | 可以查看目录内有什么东西 |
w | 可以在目录内添加 / 删除 / 移动 / 重命名文件 |
x | 可以 cd 到该目录内 |
# 11. Linux 维护文件权限的方式
在 Unix 开发时,贝尔实验室的人们都是以小组为单位进行工作的,他们共享程序和文档。基于这一原因,Linux 开发人员定义了 3 种类型的人:用户、用户组及其系统中的其他。
创建文件的用户,是文件的属主(owner)。属主是可以改变文件权限的唯一用户。(超级用户 root 可以修改任何文件的权限,这里的“用户”指的是普通用户)
每个用户都属于一个组,组权限应用于和属主位于同一组中的其他用户。
其他权限用于除了前两种之外的其他人。
# 12. 改变文件权限:chmod
语法:chmod mode filepath ...
mode 是文件的新权限,file 是文件或目录的名称
只有属主才能改变文件的权限。Linux 自动将当前用户创建的文件的属主设置为当前用户。
为了避免问题,不要给逻辑上不可执行的文件授予执行权限。
# 13. 命令格式总结
命令格式 | 举例 |
---|---|
命令名 | pwd |
命令名 命令参数 | cd /xxxx/xxxx/xxx/ |
命令名 选项 命令参数 | ls -l 1.c |
命令名 选项 选项的参数 命令的参数 | A -b C D |
- 命令名,决定要干什么事情。
- 命令的参数,决定对谁干这个事情。
- 命令的选项,以及 选项的参数,决定对这个东西干这个事情的时候一些细节性的调整或处理
# 14. 通过搜索目录树查找文件:find
find 程序的功能是:根据指定的测试条件,搜索一棵目录树,查找满足特定条件的文件。一旦搜索完成,find 将对查找的文件执行某种动作。所以,为了运行 find,需要指明:目录路径、测试标准 和 动作 。
语法:find path ... test ... action ...
测试标准:
测试参数 | 说明 |
---|---|
-name pattern | 包含 pattern 的文件名字 |
-type [ d f ] | 文件类型:d=目录,f=普通文件 |
动作:
动作参数 | 说明 |
---|---|
显示路径名 | |
-ls | 以长格式显示文件信息 |
-delete | 删除文件 |
例如
,find /home/ben -name "1.c" -type f -print例如
,find /home/ben -name "*.c" -type f -delete
# 15. 删除普通文件和目录
# 15.1. 删除普通文件:rm
语法:
rm <file-path-name> ...
WARNING
- 删除操作会涉及到文件和目录权限,没有权限无法删除。
- 删除操作不可逆。
-i
选项实现的功能是在删除前询问确定。该功能更安全,但也更繁琐。-f
选项与-i
选项相反,意味着直接删除无需询问。
# 15.2. 删除目录:rm -r
语法:rmdir <路径名 ...>
rmdir命令可以删除目录,但是前提是被删除的目录必须是空目录。所以该命令的使用率不高。
语法:rm -r <路径名 ...>
单独的 rm 命令无法删除整个目录。rm 命令 加 r 选项,可以删除整个目录,不论该目录是否是空。
# 16. 移动普通文件和目录
语法:mv 源 目标
# 16.1. 移动普通文件
语法:mv filepath 目标
- 如果目标是一个目录,则将文件移动到目标目录下。
- 如果目标是一个文件,则将文件移动到目标目录下,并修改文件名。如果目标目录下已有同名文件,则覆盖。
# 16.2. 移动普通文件
语法:mv dirpath 目标
- 如果目标目录存在,则将源目录移动到目标目录下。
- 如果目标目录不存在,则意味着移动并重命名。
# 17. 复制普通文件和目录
语法:cp 源 目标
# 17.1. 复制普通文件
语法:cp filepath 目标
- 如果目标是一个目录,则复制文件至目标目录下。
- 如果目标是一个文件,则复制源文件至目标目录并改名。如果源目录下已有同名文件,则覆盖。
# 17.2. 复制目录
语法:cp dirpath 目标
复制源目录至目标目录下。
# 18. 打包备份:gzip/gunzip、bzip2/bunzip2、tar
# 18.1. 压缩 / 解压
压缩命令 | 解压命令 |
---|---|
gzip filepath ... | gunzip filepath ... |
bzip2 filepath ... | bunzip2 filepath ... |
注意
,gzip 和 bzip2 会为每一个文件 单独压缩 。
# 18.2. 打包 / 解包
语法:tar [ cx ] [ Czjvf ] filepath
打包 / 解包命令:
打包选项 | 解包选项 |
---|---|
tar -c | tar -x |
例如
: tar -c -f xxxx.tar a.txt b.txt c.txt d.txt
例如
: tar -x -f xxxx.tar
选项 | 选项说明 |
---|---|
选项 | 选项说明 |
-C | 指定解压路径 |
-f | 此选项后紧跟文件名 |
在打包-压缩时,-f 选项指明新生成包名 | |
在解压-解包时,-f 选项指明要拆的文件 | |
-j | 代表调用 bzip2 命令,在打包完毕后,进行压缩 |
-z | 代表调用 gzip 命令,在打包完毕后,进行压缩 |
-v | 操作过程中显示处理进度 |
例子:
tar -c -j -v -f etc.tar.bz2 多个文件路径名
tar -c -j -v -f etc.tar.bz2 目录路径名
tar -c -z -v -f xx.tar.gz xxxx
tar -c -j -v -f [生成的文件名] [被压缩的文件或目录名]
tar -x -j -v -f [被解压的文件名]
注意,压缩的时候,tar 命令有参数;解压的时候,tar 命令没有参数。
# 19. 查看文件内容
语法:cat filepath
cat 一次显示整个文件,如果文件的长度比屏幕的大小要大,那么有些文件的内容会在当前屏幕的上面。
cat 适合显示内容足以在屏幕上显示出来的文件。
语法:less filepath
按 q
退出
# 20. Vi
浏览模式:
a
:在光标所在之后,进入编辑模式。i
:在光标所在之前,进入编辑模式。o
:在光标所在行之下,进入编辑模式。
命令模式:
:w
:保存(不退出):q
:退出(可能会不让退出):wq
:保存并退出:q!
:退出,不保存
浏览模式下:
x
:删除当前光标所在位置的内容(一个字符)dd
:删除当前光标所在行(一整行)。u
:撤销刚刚对文件做出的操作。
# 21. 其它
绝对大多数命令背后,都是一个可执行程序。执行某个命令,本质上就是在运行这个可执行程序。
which 命令名
通过 which 命令,可以去“查询”一个命令背后所执行的那个可执行程序。
操作系统(无论Unix/Linux,还是Windows,亦或者是 MacOS)中有一个叫 PATH 的环境变量,它以“:”(Win中是“;”)作为分隔符,记录了若干个目录的地址。当你输入命令时,操作系统就是在这些目录中,依次查看是否有一个与命令同名的可执行文件(程序)。有,则运行它。没有,则报告“command not found”命令未找到。
/etc/profile
是全局配置文件,需要 root 账户身份才能修改。~/.bashrc
是各个用户的个人配置文件。个人需要修改个人的环境变量时,修改的就是这个文件。修改后,需要重启终端,或系统。
su - root
将当前用户的身份,切换成 root 用户(超级用户)。此时,需要输入 root 用户的密码。
普通该用户切换成 root 后,使用 exit 命令可以退回成普通用户。
exit
root 用户的家(Home)目录是 /root
目录。这是与其他普通用户不一样的。
如果,你所要执行的可执行文件的所在位置 在 环境变量中 PATH ,那么,你只需要在终端中输入该文件的文件名既可。
可以通过 echo $PATH
查看 PATH 环境变量的值。
如果,你所要执行的可执行文件的所在位置 不在 环境变量中 PATH ,那么,你必须在中断中输入该文件的绝对路径名,或相对路径名。
反而言之:
如果,你想执行某个可执行文件,但又只想输入其文件名,不想输入其绝对路径或相对路径领。那么,你就需要将该文件所处的位置添加到环境变量 PATH 中。
Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的
目录 | 说明 | 类比 Windows |
---|---|---|
/usr | 系统级的目录 | C:/Windows/ |
/usr/local | 用户级的程序目录。 用户自己编译的软件默认会安装到这个目录下。 | C:/Progrem Files/ |
/opt | 用户级的程序目录。一般解压即可用的软件放在这里,不用时,直接 rm -rf 掉即可。 | D:/Software |
『完』