1.cat指令
之前我使用过很多的cat指令,大家都应该知道cat指令的作用了。
语法:cat [选项] [文件]
功能:查看目标文件的内容
1.1基本用法
cat用于查看文件的内容,比如,我们创建一个新文件后,在里面写入内容然后用cat查看:

如果我们写入几行会怎么样?

可以看到它会输出空行,并且在文件末尾自动换行。
我们发现如果cat后面不接文件也可以([]里面内容代表可以省略),那么我们不接文件会怎么样呢?
1.2不接文件
我们直接cat会发现:

cat后面不接文件代表它会从键盘文件读取,然后把从键盘文件读取内容显示在显示器上,如:

只要我们回车,它就会继续等待我们输入,这是因为读入键盘文件时,这个键盘文件没有结尾,只能不停等待用户输入,直到我们自己退出该文件为止。
想要退出这个操作,直接Ctrl+C即可

1.3接选项
我们在add.txt中进行nano add.txt操作,然后输入以下内容:
cpp
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
Today is Mar twenty-five day!
这样操作主要是为了后面看出各个选项的区别。
用Ctrl+X保存后回车退出即可。
这样cat add.txt的结果是:

1.3.1-b选项
-b对非空输出行进行编号:

也就是说,如果是非空行它将会从数字1开始往下编号,对空行则不编号,很好理解。
1.3.2-n选项
功能:对输出的所有行编号:

也就是相当于给原来文件的每个行(包括空行进行编号)
1.3.3-s选项
功能:不输出多行空行:

对比我们不接选项:

我们会发现,第三个today行到第四个today行中间只有一个空行,省略了两个,也就是说:-s选项可以合并多个相邻空行为一个空行输出!
1.4输入重定向
cat不接任何东西时是从键盘文件进行输入,而我们如果不想要它从键盘文件读取,而想从add.txt文件中读取,我们除了用cat add.txt外,还可以用cat < add.txt,比如:

如果各位有两台Linux机器的话,可以完成一个机器输入echo "hello world" > /dev/pts/1(这是另外一个机器的显示器文件路径),然后在另一个机器上就会显示:hello world。
如果想要知道自己的显示器文件路径,直接:
bash
ls /dev/pts

而我们的显示器文件的路径就是/dev/pts/n 这个n是指我们ls /dev/pts后的第一个结果,如果我们只打开了一个Xshell,则只有1个显示器,若我们又用另外一个用户登录Xshell,这时候用ls /dev/pts就会出现0 1 ptmx,也就是另外一个用户的显示器文件路径为/dev/pts/1,(我们每次登录系统,系统会在ptmx下新建一个文件,即显示器文件)。
当我们只有一台显示器登录该地址,如果我们使用echo "hello world" > /dev/pts/0,则会在自己屏幕上显示出:hello world,比如:

这就相当于/dev/pts/0 < /dev/pts/0前面那个文件代表我们的输入重定向的文件,而后面那个代表我们显示器的路径,这也就相当于其他人的显示器文件从我们的echo指令输入的内容读取了!
如果我们在没有另外一个显示器的情况下使用输出重定向,则不被允许了:

这个表示:你没有权限向/dev/pts/1这个终端设备写入内容。
总之,这个输入重定向在cat中有应用,之后的指令可能也有应用,这里先提示一下,以后用到了至少知道。
2.mv指令
mv指令是move的缩写,有移动的意思。
语法:mv [选项] 源文件或目录 目标文件或目录
功能:用来移动文件或为文件改名
2.1基本用法
文件重命名:
当第二个参数(目标文件或目录)是文件时,mv指令将会把原文件名重命名为目标文件名:

我们发现,mv后,原文件会被删除,那么如果目标文件不存在呢?

我们发现,只要目标文件不存在,它会直接改名,不管后缀是否对应!
那我们能不能把某个文件移动到其他路径下呢?

也就是说,如果第二个参数(目标文件或目录)为目录时,则会把第一个参数作为第二个参数的子目录或文件?
如果第一个参数为目录呢?

我们看到最后一句话是:无法移动hello目录到12.06下:目录不为空。
这是因为12.06下的hello目录与要移动的hello目录名相同,为了防止覆盖原路径下的同名目录,所以这个操作被拒绝了。
有两种方案,第一种是不推荐的:把./12.06/hello下的所有子目录和文件都删除,然后再移动就行:

因为我们删除了./12.06/hello下的所有子目录或文件,所以使得该目录为空,从而可以被安全覆盖,因此这操作是被允许的!
但是这样成本也太大了吧,只是移动一个文件,我却要把文件给删除,难道两个不能都保存下来吗?
第二种方法:我移动到12.06路径下,但是我还要自己命名为hello2:

我们通过这种方式的目的是:12.06目录下不存在hello2目录,因此新建了一个,也就相当于把原hello的目录名改成了hello2,这种方式成本大大降低了。
2.2常用选项
-f:force,如果目标文件已存在,不会询问直接覆盖;
-i:若目标文件已经存在,就会询问是否覆盖。
这两个如果同时使用时,优先级高低根据系统来,但是建议不要用第一个选项,防止不小心覆盖了原文件而出错,建议各位自己使用mv时使用-i选项,或者自己在vim ~/.bashrc里面增加:
bash
alias mv='mv -i'
然后用Shift+ZZ保存退出之后就可以每次进行mv操作时默认询问了。
3.总结
这两个指令用得还是比较多的,而且比较抽象,需要加以应用才能理解更透彻,这些指令还有一些选项需要各位自己去问AI大模型了。