# 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 显示工作目录中的文件,此时 lsls . 等价。

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=普通文件

动作:

动作参数 说明
-print 显示路径名
-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

  1. 删除操作会涉及到文件和目录权限,没有权限无法删除。
  2. 删除操作不可逆。
  • -i 选项实现的功能是在删除前询问确定。该功能更安全,但也更繁琐。
  • -f 选项与 -i 选项相反,意味着直接删除无需询问。

# 15.2. 删除目录:rm -r

语法:rmdir <路径名 ...>

rmdir命令可以删除目录,但是前提是被删除的目录必须是空目录。所以该命令的使用率不高。

语法:rm -r <路径名 ...>

单独的 rm 命令无法删除整个目录。rm 命令r 选项,可以删除整个目录,不论该目录是否是空。

# 16. 移动普通文件和目录

语法:mv 源 目标

# 16.1. 移动普通文件

语法:mv filepath 目标

  1. 如果目标是一个目录,则将文件移动到目标目录下。
  2. 如果目标是一个文件,则将文件移动到目标目录下,并修改文件名。如果目标目录下已有同名文件,则覆盖。

# 16.2. 移动普通文件

语法:mv dirpath 目标

  1. 如果目标目录存在,则将源目录移动到目标目录下。
  2. 如果目标目录不存在,则意味着移动并重命名。

# 17. 复制普通文件和目录

语法:cp 源 目标

# 17.1. 复制普通文件

语法:cp filepath 目标

  1. 如果目标是一个目录,则复制文件至目标目录下。
  2. 如果目标是一个文件,则复制源文件至目标目录并改名。如果源目录下已有同名文件,则覆盖。

# 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

vi.png

浏览模式:

  • 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

『完』