写在前面

你应该听过Linux,但是也许没有听说过Unix。实际上,Linux就是Unix的一个变种,它的本质还是Unix。就好比Mysql支持sql语句,但又比原生的sql多了一些自己的语法一样。

学习Unix,一方面可以让我们多了解一些其他基于Unix的操作系统;另一方面,Linux也有不同的发行版,但它们最基本的东西都是通用的。学习Unix更便于我们在不同的Linux系统间进行切换。

本系列将使用Ubuntu系统,用的是云服务器,所以不会有图形界面。


最常用的命令

下面这些都是Unix最常用的命令,使用率高达80%(据统计),各命令的含义以及它们的参数都要滚瓜烂熟!

命令格式

Unix中一条命令的格式为:命令名 [-选项] [参数]

选项包括长选项 --word和短选项 -character,如 ls --allls -a,它们是全称与简写的关系。

有的选项需要带上参数,如 find -type f指定搜索的文件类型为普通文件(file)。

然后需要理解什么是命令名。命令名可以是一个可执行程序、也可以是shell内置程序或脚本程序。我们可以使用 type来查看命令类型:

image-20220619110646543

man命令

Linux系统的帮助文档非常丰富,使用 man命令就可以从手册中查看各命令的使用说明。格式为 man [选项] [需要查询的命令]

章节

首先需要知道Linux帮助文档的划分的章节:

image-20220619114415935

我们最常用的就是章节1的内容,其他章节的简介最好也记一下。

选项

man命令后面直接跟需要查询的命令即可。常用的选项有:

image-20220619115736234

比如 passwd在章节1和章节5都有出现,而 man passwd默认查看的是靠前的内容,即章节1中的内容。要查看章节5的内容有两种方式:

  1. -5选项:man -5 passwd即可直接查看章节5中 passwd的内容。
  2. -a选项:从前到后依次查看内容。

    image-20220619120316347

有时候只想要查一下命令的功能而不想去翻手册,使用 -f选项即可,括号后面给出了章节号:

image-20220619120534658

汉化

由于参考手册是全英文的不太友好,所以可以使用汉化包。

  1. 执行脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    wget  https://src.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz/13275fd039de8788b15151c896150bc4/manpages-zh-1.5.1.tar.gz
    tar xf manpages-zh-1.5.1.tar.gz
    cd manpages-zh-1.5.1/
    ./configure --disable-zhtw --prefix=/usr/local/zhman
    make && make install
    cd ~
    echo "alias cman='man -M /usr/local/zhman/share/man/zh_CN' " >>.bash_profile
    source .bash_profile

    这些命令如何生效的现在无需掌握。如果没有报错那么汉化就安装成功了。

  2. 使用 cman:为了避免覆盖 man命令,所以将该命令命名为 cman

    1
    cman ls

    image-20220619121347088

目录相关

使用图形界面的好处就是我们可以很方便地通过点击图标进入文件夹,使用命令行进行这些操作相对抽象。但是一些高级功能在图形界面的操作会很繁琐,而习惯命令行的话就会深感其简洁与强大。

Unix文件结构

Unix的文件结构是这样一种树形结构,各文件夹的内容将在后面的文件系统部分进行探讨。

image-20220619122158818

常常说Linux一切皆文件,目录、设备等都是文件,只是它们的文件类型不同。Unix采用 /来分隔各级文件(windows为 \),如 /home/programming/c_source/a.cpp。反映在网页的URL上也是一样,如 https://blog.fullcomb.top/post/62c4b567.html,因为URL提出的时候服务器系统都是Unix。

ls命令

使用 ls可以查看目录下的内容,它常用的选项如下:

image-20220619123841742

首先需要知道隐藏文件。每个文件夹都有 ...两个隐藏文件分别代表本目录和上一级目录,而直接 ls是不会显示隐藏文件的,需要 ls -a

此外还需要知道各命令的组合,如 ls -atrs1的作用就是按照时间反向排序的顺序一行一文件地输出文件名及其大小。

ls -l可以查看文件的详细信息,包括文件类型、不同用户组的权限、文件所有者、大小、创建时间等:

image-20220619125046495

文件类型和权限也会件系统部分进行探讨。

cd命令

cd可以快速地进行目录间的切换,类似于鼠标点击文件夹的操作。路径可以以相对路径或绝对路径的方式给出。

相对路径和绝对路径我相信都没问题,所以不多说了。

pwd命令

pwd命令直接打印当前所在目录的绝对路径。

tree命令

bash自带的tree命令可以以树状的形式显示目录的层级结构:

image-20220619130313156

文件操作相关

touch命令

touch的作用是创建一个普通的文件,如文本文件,它创建的是一个空文件。

image-20220619125517865

此外,我们也可以先编辑后保存来创建文件:vim a.cpp,保存并退出后也可以看到a.cpp。因为我们更多的是创建文件的同时也要编辑,所以touch反而用的少了。

mkdir命令

mkdir的作用是创建目录,它比较常用。

一次可以创建一个空目录,如 mkdir test;也可以 -p选项来创建多层的目录,如 mkdir -p test1/test2/test3

rm命令

rm的作用是删除一个普通文件或目录。但是,单独使用 rm的话只能删除普通文件,而不能删除目录:

image-20220619131422636

所以需要知道 rm的常用参数:

image-20220619131917005

要删除一个目录,需要使用 rm -r [目录位置]命令。经常说的 rm -rf就是强制递归删除工作目录的意思(跑路警告)。

需要注意Unix是没有回收站的,rm一旦删了就无法恢复了。所以这时候需要清醒点,搞清什么该删什么不该删,不要脑子一热。为了保险最好使用 rm -i

image-20220619132448963

需要注意递归删除分为descendremove两个阶段。结合 -i可以人为地控制这个过程。

rmdir命令

rmdir只能删除一个空目录,实用性太低。要删除一个目录还是得用 rm -r

cp命令

cp命令可以将一个文件或目录拷贝到另一个目录下。它的格式为 cp [选项] [src] [des],如 cp a.cpp c_source

但是,要拷贝一个目录过去的话得使用 -r选项:

image-20220619133453047

mv命令

mv的格式为 mv [选项] [源文件或目录] [目标文件或目录],它的使用和 cp差不多,区别是移动后原来的文件或目录就不在了。

此外,mv还可以实现文件的重命名。如将a.cpp改名为b.cpp,只需要 mov a.cpp b.cpp即可。

cat命令

cat命令用于查看文件内容,其格式为 cat [选项] [文件]。它的选项有:

image-20220619145550791

image-20220619145336861

时间相关

date命令

date命令用于查看当前时间,不同的格式控制符(不是选项)及组合可以控制时间的显示格式:

image-20220619142040672

image-20220619135335652

除了使用系统提供的时间组合,我们也可以自己组合。如日期/24小时制的时间

image-20220619135615349

cal命令

cal用于查看日历。直接使用 cal查看的是本月的日历;还可以指定位某一年查看这一年的日历:cal 2022

查找相关

find命令

find的作用是在指定的路径下查找文件,它是Linux最强大的工具之一。格式为 find [路径] [选项+参数]

我们需要知道 find的选项以及对应的参数,常用的有:

image-20220619143131163

需要注意文件名可以使用通配符和正则表达式,所以文件的匹配可以很灵活。常用的通配符有:*(匹配多个任意字符)、.(匹配单个任意字符)。

假设我想查找所有以.cpp结尾的普通文件,那么命令为:

image-20220619144314114

grep命令

grep用于在文件中查找匹配的内容,格式为 grep [选项] [搜索的字符串] [文件]。它的选项有:

image-20220619144628654

如在a.cpp中查找带有IN的行且忽略大小写,输出带行号:

image-20220619144944833

常用的工具

zip和unzip

压缩和解压的格式分别为:

1
2
压缩:zip [生成的压缩文件和后缀名.zip][要打包的文件或目录]
解压:unzip [压缩文件名] -d [目录名](不指定输出默认会解压到当前目录下)

zip是很繁琐的,它只会打包当前目录,而不会将子目录一起打包,所以还需要使用 /*来包括子目录下的文件。如果有多层,还要反复 /*。如执行 zip test_zip.zip test1/*后解压到dir下,发现test1最多只打包到了第二层。

image-20220619150652050

tar命令

tar可以弥补 zip的缺点,将该目录的子目录及其中的文件一起打包:

image-20220619152212630

使用 tar,需要知道它的选项以及它们的常用组合:

image-20220619152755591

  • 创建压缩文件的组合为:tar -cf [压缩包的名字]
  • 解压压缩文件的组合为:tar -xf [压缩包的名字] -C [输出目录的路径]

自定义命令

alias命令

前面说过,一个命令名可以是一个脚本。是的,我们可以创建一个脚本,然后将一个命令名作为这个脚本的别名。每次只需要输入命令名,即可执行这个脚本了。

使用到了 alias命令:

如在 /home/programming/py_source/a.py里面写入 Hello,World!,创建命令 greet来执行它:

1
alias greet="cd /home/programming;python3.9 a.py"

这样每次输入 greet就可以输出 Hello,World!了,是不是很有意思?

再来点有趣的吧。不是有字符画吗,咱们将字符画放到文件里面,然后再 cat输出文件(greet)中的内容(顺便清个屏):

1
alias greet="clear;cd /home/programming;cat greet"

效果如下:

image-20220619154131144

写入配置文件

使用上面的方式创建命令,只会在终端开启的周期内生效。如果我们想要命令一直有效,那么就需要将 alias写入配置文件:

1
2
echo "alias greet='clear;cd /home/programming;cat greet' " >>.bash_profile
source .bash_profile

常用快捷键

建议自己去试试这些快捷键,提高熟练度。

光标移动类

image-20220619154945118

修改文本类

image-20220619155346239