前言
1.windows系统中,标识文件唯一性,是通过路径标识的。桌面其实也是一个文件夹,只不过用图形化界面的方式显示出来,方便操作。
2.无论是windows还是linux,一旦登录,就会处在一个默认的路径下。那windows默认处在的就是桌面这个文件夹里边。
3.下文所说的 文件夹 == 目录。
基本指令
pwd --- 当前所在路径 --- 类似于windows里的 D:\360安全浏览器下载
whoami--- 谁在访问linux系统
clear --- 清屏
ls --- 显示当前目录下的所有文件名 --- ls -l 等价于 ll
mkdir 新建的文件夹名 --- 在当前目录下新建一个文件夹
cd路径/当前路径下想进入的文件夹名 --- 进入指定路径(绝对/相对)/进入文件夹
touch 新建文件名 --- 在当前目录下,新建一个普通文件
细化指令
问题1:如果在windows里新建一个空的文件,这个文件要不要占据磁盘空间?
答案:要的,文件的属性也属于文件的一部分,也是数据。文件的属性指的文件创建的时间,文件名字,文件的大小等等。文件是由文件的内容跟文件的属性两部分组成,所以空文件也要占据磁盘空间。
ls
ls用于显示文件的属性,单独的一个ls默认显示的是当前路径下的所有文件名,如果ls后边加路径就可以访问该指定路径目录底下的所有文件名,ls后指定文件名的话,默认访问的就是当前路径下的该文件名。
ls选项:
-l--- 显示当前路径下所有文件的所有属性
-a--- 显示当前路径下的隐藏文件或者文件夹
注:Linux中,隐藏文件通常以.开头
-d --- 不查看目录里边的内容,只显示目录本身
pwd和cd
补充知识:Linux中.表示当前路径,..表示上一级路径。
pwd是用来显示当前所处路径的,/是路径分隔符
cd ~ ---~表示当前用户的家目录(当前用户默认所处的路径) --- 家目录就相当于windowsC盘里的用户文件夹点进去的那个目录 --- 就是你家的详细地址
注:在CentOs中,root账户的家目录为/root,普通用户的家目录为/home/XXX
cd - --- 回退到上一次所处的路径
cd ..--- 回退到上一级目录底下
cd .--- 进入当前路径,路径不变
当我们一直cd .. ,到最后一定会到/,/叫根目录,根目录是Linux路径的起始路径。就是你在哪个国家。也就是说Linux中的目录本质是以树形结构为基础的。Linux中的整个文件结构是树状结构。它是一棵多叉树。

结论1:这棵多叉树的叶子结点一定是普通文件或者空的文件夹。
结论2:路上结点(非叶子结点),本质就是文件夹。
结论3:在本文一开始就说到,用路径标识文件唯一性,这就说明路径是唯一的,为什么路径是唯一的呢?因为每一个结点有且仅有一个父亲结点,从根目录/往下定位每一个文件或者文件夹的时候,就是唯一的。
结论4:在任何的目录下,都会隐藏.和..(上级目录),可以这样理解,每一个目录都相当于是一个结点,里边包含俩指针.和..,.就相当于是指向自己的指针,..就相当于是指向其父亲结点的指针。只不过在显示的时候,一个显示成.,一个显示成..。这也就可以理解为什么cd ..的时候退到上一级路径,因为当前目录里有..,它能让我们以指针方式回到上级目录。那根目录/里的..指向的就是自己,所以再cd ..就没办法回退了。
相对路径跟绝对路径

假设现在要访问hello.c这个文件,有两种方式可以到达。
绝对路径:/usr/bin/hello.c 相对路径:../bin/hello.c
绝对路径是通过根目录/作为参照点,相对路径是从我当前所处的目录为参照点,一旦当前所处目录发生变化,那相对路径就可能会失效了。但对于一个已经确定好"参照物"的相对路径,比如上边的../bin/hello.c,就可以保证唯一性。因为当前目录的上一级目录是唯一确定的,而当前目录的上一级目录是作为子多叉树的根,由根结点到任何一个结点都是唯一标识。(这棵子树为图中绿色圈出部分)。
综上,不管是相对路径还是绝对路径都可以对指定的文件进行唯一的路径标识。更深一点理解,绝对路径就是一种确定好位置的相对路径,是以/根目录为参照的。绝对路径就是一种特殊的相对路径。
建议:配置文件的时候一般用绝对路径,因为绝对路径不管怎么样都不会变。常规操作用相对路径,因为绝对路径还是过于冗余,过长。
现在我们知道..是上一级路径,.是当前路径。..就是帮我们找到上一级目录的,那.的作用是什么呢?.是用来执行当前路径下的程序的。程序也是一个文件,要想执行一个程序,就得先找到它,可以用绝对路径找,也可以用.这种相对路径找。
假设在当前目录下有一个my.exe文件。要执行它就可以用./my.exe这种方式
touch
stat --- 比ls获取文件的更多属性,包括文件的AMC时间,具体之后说
我们知道touch是可以在当前路径下创建一个普通文件,并且还可以修改文件的AMC时间,具体之后说
mkdir
mkdir -p a/b/c/d --- 在当前目录下创建一串路径a,b,c,d
Linux的文件类型(浅了解,具体在后边的博客里会讲)
Linux操作系统的文件类型,不由文件后缀决定,但这并不代表Linux不用后缀,用后缀可以帮助我们自己更加清楚文件的类型,并且许多编译工具是区分文件后缀的。
Linux里主要由两类文件,ls -l 指令用来显示当前路径下所有文件的属性,在属性的第一个字母标记了文件的类型,d开头的是目录文件,-开头的是普通文件,如文本,二进制可执行程序,图片,视频音频等,动静态库。
file 文件名 --- 可以显示文件具体的类型。
rmdir
rmdir 目录名 --- 用来删除空目录
rm
rm删除普通文件:用rm 普通文件名 去删除文件或者文件夹的时候,对于普通账号,一般不会提醒,但是如果是管理员root账号,它会提醒,类似于rm: descend into directory 'a' ? ,此时还想删除,就输入y,不想删除就输入n。因为Linux里是没有回收站的,删除就删除了,还有一个原因是root账户的权限太大了,防止误操作。如果不想要提醒,就rm -f 普通文件名,强制删除。
rm删除目录:由于Linux的目录结构是一棵多叉数,树是递归定义出来的,而目录从本质上就是一棵子树,那么删除的时候自然也要递归删除。rm -r 目录名,同理,强制删除用rm -rf 目录名(r是递归单词的首字母)
注意,rm删除目录的时候会先进入目录最深处,然后类似于递归返回的时候依次删除。从下往上
man
man 指令名,帮助我们查找某个指令的基本用法,相当于查找帮助手册类似的功能。以下是man touch的结果,按q退出查询。但一般现如今我们都用搜索引擎直接去搜某个指令的用法功能即可,用这个指令查出来的内容相对来说比较官方,可以作为一个标准去衡量用搜索引擎搜出来的内容。

如果我们man man会发生什么呢?
往下看会看到man里边包含了7个手册,默认会去一号手册(可执行程序或者是命令)里去查找,如果在一号手册找不到,就会去二号手册(系统调用)里去找,依次往复。其中经常去查的就是前两个手册,前两个手册代表的意思已经说过,三号手册指的主要就是C语言的库函数(没有C++,要查C++直接去cplusplus里去找),比如说man 3 printf的意思就是去三号手册找printf这个库函数。这里再简单说一下为什么除了前两个手册,其他手册里的东西不太推荐直接在linux里边搜是因为指令或者系统调用都是万年不变,不会去更新了,而像那些库函数可能还会出什么新特性,此时可能在linux里就搜不到了,所以那些东西就直接去官方文档里边搜,搜出来的肯定是最新的。
cp
补充知识:先有一个基本认知,"Linux下一切皆文件"。因此当我们向显示器打印的时候,显示器,也就是xshell打开来的那个终端,我们认为它就是一个文件,而打印也称为写入,因此,向显示器打印就相当于是向显示器文件进行写入。同理,从键盘读取数据就相当于是从键盘文件中读取数据。
在验证Linux下一切皆文件这件事之前得先知道以下的知识。
echo命令与printf命令都是向显示器写入数据,只不过printf是格式化打印数据。
接下来看几行指令并且看一看结果。
由上文知道echo指令是向显示器写入数据,但是现在在后边加了**> hello.txt** 之后不仅没有在显示器上写入,转而在当前目录下创建了一个hello.txt文件并且将hello 你好写入到了text.txt这个文件里边,这个过程叫做输出重定向,(重新确定输出的方向),cat指令是获取文件的内容。
输出重定向的特点其一就是文件如果不存在,就会默认新建。其二就是每次新写入数据,都会清空旧数据并且重新进行写入。
既然输出重定向之前会先清空文件,那直接写成如下的形式就可以直接清空hello.txt文件。如果写成两个>>就不会清空,会在后边追加,>>叫追加重定向。
cat 文件名 的作用是获取文件里的数据并且打印到显示器上,那如果就一个cat呢?程序就会等待用户从键盘输入数据然后再打印,相当于就是scanf然后再printf。单独一个cat的功能就是从键盘文件读取数据并且打印到显示器上。cat < 文件名 ,此时就是输入重定向,从文件里读取数据并且显示出来。注意虽然cat 文件名 这种方式也可以将文件里的数据输出到显示器上,但底层跟输入重定向是不一样的,具体之后的博客里会有体现。
验证:既然Linux下一切皆文件,那当我们打开xshell之后显示出来的那个终端必然也是一个文件,它一般存在路径/dev/pts之下,pts就表示终端文件的意思。
现在我们先打开一个终端。ptmx先不管,但是0就表示当前这个终端文件,那如果在同一个IP地址的条件下再打开一个文件呢?
再打开另一个终端文件之后,惊喜的发现,此时目录底下就多出了一个名叫1的文件,这个其实就表示的是另一个登录的终端文件。
那么此时,/dev/pts/1表示的不就是另一个终端文件了吗?终端文件的文件路径就是/dev/pts/*,其中*代表的是终端文件名,一般就是数字0123...当我们用echo指令打印的时候,默认就会打印数据在当前这个终端文件,而当输出重定向的时候就会打印到指定的终端文件里边去。
cp 源文件 目标文件 ,cp将源文件里的内容拷贝到目标文件里,如果目标文件已经存在就清空原数据后再拷贝内容,如果目标文件不存在就会创建并且拷贝内容过去。如果是cp 源文件 路径,没有指定文件名,就还是用源文件的文件名。


当用cp去拷贝目录的时候,因为Linux里的文件结构是树形结构,所以要去递归拷贝-r,如果不想要提示就再加个-f。

mv
mv src dst,mv的用法跟cp类型,作用就是剪切+拷贝,其中dst可以是指定目录,也可以是路径或者文件名。如果dst是不存在的,此时mv的功能就是剪切拷贝加改名字。总之mv的功能就是剪切拷贝和改名字。
cat与tac
打印指定普通文件的内容,它是用来查看文件内容的,而之前那个指令ls是用来查看文件属性的,文件由文件内容和文件属性两个部分构成。cat -n 文件名,可以在输出文件内容时自动把文件里每一行的行号带上。tac跟cat的功能一模一样,只不过cat是从文件的开头向后打印文件内容,而tac是从文件的末尾倒叙打印文件的内容。(tac cat字母本身就是倒了一下),还有就是关于cat的另外两个标签,没什么用就先不讲解了。
more和less(推荐)
cat只支持查看十几二十行的那种小文件,如果文件的内容过长就会导致刷屏。因此more和less命令就登场了,more 文件名 会打印满一屏幕就不打了,按回车会往下翻,按q退出,但是more不支持按上/下键去上翻或者下翻。less命令的用法跟more一样,但是less打印完一屏幕就不打了,还支持按上/下上下自由翻阅,**/"搜索关键字"**按回车后可以找到对应关键字,随后按n可以找到下一个匹配的关键字的地方,注意less其实跟其他工具结合起来用为最优,重点就是它支持上下翻阅。
head和tail
head可以查看文件的头,head 文件名 默认是打印文件的前10行,head -数字 文件名可以查看文件的前"数字"行。tail跟head完全相反,tail打印的是文件的后"数字行",默认也是打印10行。那如何查看文件中间的内容呢?假设hello.txt文件有10000行,现在想查看5000~5010行,此时可以head -5010 hello.txt > text.txt拿到hello.txt文件的前5010行,然后tail -10 text.txt拿到text.txt文件的后10行,这样不就拿到5000~5010行了嘛,这是一种方式,但是这可不是什么好方法,假设文件有10亿行怎么办?接下来来看点别的方法。
补充知识:我们可以通过|,也称之为管道,去连接两条指令,前一个指令的结果通过|连接到下一条命令,因此上边的5000~5010行的获取就可以这么写,head -5010 hello.txt | tail -10就可以了,通过管道将上一条指令的结果相当于作为下一条指令的操作对象。管道是有入口跟出口的,用于传送资源,此时的hello.txt文件就相当于是传输到管道里的资源,tail -10就可以直接去管道里获取资源。至于管道的原理涉及到进程的知识,后期再说,现在就笼统的知道,由于Linux下一切皆文件,那么管道也是文件,其实上边利用管道的那一行指令就相当于刚才利用text.txt的那两行指令,只不过text.txt会真实存在磁盘上,而管道是内存级的,在磁盘上看不到,详细的之后说。
管道不止只能组合两条指令,可以组合无数条,它可以将多个指令通过管道串起来,将多个指令的功能集合在一起,这就叫对文本内容做流水线处理。举个例子,wc -l是统计当前文本有几行。
date
date用来显示当前Linux系统下的时间的,看着系统的时间显然有点不方便。因此date是支持格式化获取年月日时分秒的。+是固定格式,%Y是年份,%m是月份,%d是天数,%H是小时,%M是分钟,%S是秒,每个百分号之间的-或者_是自己指定的显示格式。

date +%s 获取到的是一个时间戳,时间戳是从1970年1月1日(UTC/GMT的午夜)开始到现在所经过的秒数。时间戳的本质就是一个计数器。通过**-d @时间戳**的指令可以将指定的时间戳转化成我们指定格式的人能看得懂的时间,当时间戳指定为0的时候其实表示的就是时间戳开始的时间,为什么不是0时0分0秒,因为世界的时间是以伦敦格林尼治为标准的,该地距离北京东八区的时差是8个小时。

cal
cal显示的是当前月份的日历,cal -3 查看的是当前月份,前一个月和后一个月的日历,cal 年份查看的是该年一整年的日历情况。
find
find 路径 -name 文件名 ,可以用来查找指定路径底下指定的文件。(*是通配符,表示任意内容,*.c意思就是所有以.c为后缀的文件,~是家目录)
find既然可以查找文件,自然也可以查找指令,例如从根目录开始查找指令ls,由结果可知ls指令在路径/usr/bin/ls里,也就是说,我们所谓的大部分的指令只不过是Linux系统固定目录(/usr/bin)下的可执行程序,只不过就是程序员将代码写好并且编译成了二进制可执行程序文件之后存在了/usr/bin这个目录底下而已,因此直接用/usr/bin/ls就相当于是在用ls这个指令。指令跟我们自己写的代码编译运行后得到的那个.exe文件是一个东西。
which
which可以搜索系统命令在哪个路径底下存着,which 指令名 就等同于find /usr/bin -name 指令名。用过上文find查找ls那条指令的人都知道,find第一次查找的时候需要等待一些时间,原因就是find是从/根目录开始找的,但注意find不是非得从/开始查找,而是上边我们指定它开始查找的路径是/。which相当于直接去/usr/bin目录底下找了。usr是用户的意思,bin是二进制的意思。
file
file用于查看一个文件详细类型的。
alias
alias可以给指令起别名,注意别名跟指令之间不能有空格,即等号两边不能有空格。如果不想zhangsan再是ls -l -a的别名的时候就用alias zhangsan=' ' (空格)就可以了。
不知道大家有没有发现,之前说的大部分指令其实就是一个可执行文件,其中ls存在/usr/bin/ls这个目录底下,因此不管用ls还是/usr/bin/ls都是等效的,但结果发现两个查出来的文件怎么颜色不太一样,一个有标亮一个啥颜色没有,用which查了一下ls之后发现,ls其实是指令'ls --color=auto'的别名,--color=auto这个选项的作用就是给文件标亮的。所以得出结论,执行指令的时候会优先搜索指令的别名,而不是从/usr/bin/XX里去查找指令,ls跟/usr/bin/ls的作用虽然一样,但此ls并非彼ls。
别名是内存级的,重新登录一下就没有了,它不是存在/usr/bin/XX里的。系统里的别名,就如上边的ls,每次重新启动的时候,系统会重新生成。
grep和top
grep是行文本过滤工具,可以从文本中筛选出我们指定的关键词。
top指令获取到的东西就等同于windows里边的任务管理器。htop是top的加强款,显示出来的信息更加详细。
打包和压缩命令
打包 = 把多个文件 / 文件夹,合成一个大文件 只做合并 ,不减小体积,大小差不多是所有文件总和。压缩 = 减小文件体积 把单个文件(或打好包的文件)算法压缩,占用空间变小。至于为什么要打包压缩,直接去问大模型即可。
zip
zip lesson.zip lesson //将lesson文件打包压缩成lesson.zip
zip -r lesson.zip lesson test hello //将多个文件或者文件夹一起打包压缩
unzip lesson.zip //对lesson.zip进行解压解包
//如果是文件夹,那么在打包压缩的时候就需要加上-r,递归处理。打包压缩完,为了确保是否正确打包压缩,可以mkdir新建一个文件夹,将打包压缩后的大文件mv到新建的文件夹里去解压解包看看是否正确。unzip的时候默认是解压解包在当前目录下,也可用-d标签指定解压解包到指定路径。
rzsz
rzsz是windows端和远端Linux机器通过xshell传输文件的工具,rz是从windows端传文件到远端Linux机器,安装好之后就可以直接从windows端拖拽了。sz则相反。
tar
tar czf lesson.tgz lesson//打包压缩,c表示创建一个压缩文件,z表示打包的同时进行压缩,f后紧跟指定的压缩后的文档名。
tar xzf lesson.tgz//解压,制定解压到哪个目录需要用到标签-C
scp
scp主要是用于两台Linux机器之间的网络数据传输的
scp 压缩包名 用户名@目标云服务器IP地址:目标路径
//将当前这台机器的压缩包传输到目标云服务器的指定路径里。
passwd输入密码,目标云服务器账号的密码(相当于是对你进行身份认证),密码不回显,如果密码输错了,ctrl+del,可以将历史输入的内容删除掉。
bc
bc是Linux里的计算器,也支持浮点数运算。bc也支持管道。
补充知识:如何查看你的Linux机器的体系结构?
问这个问题其实是在问你CPU架构。用指令uname -a (或者uname -r)效果差不多,主要是显示显示主机名,内核版本,体系结构。重点是体系结构,x86一般是指32位,x86_64一般是64位。
热键
Tab:自动补全,比如要输入which,假设你现在输入了wh,连续按Tab两下,系统就会将所有wh开头的命令显示在屏幕上,如果输入的是whic,仅需按Tab一下就可以将which这个完整的指令补全了。如果对着屏幕直接Tab两下,那么就会将系统里的指令全部打印在屏幕上,如果没反应说明你的系统不支持。
Ctrl + c终止当前程序,如果当前程序是死循环,按一次可能没用就多按几下。
Ctrl + r可以搜索历史写过的指令,输入之前输过的指令串里的某一个指令就可以搜索到之前输入过的指令。
!l意思就是将上一次最近输入的以l为开头的指令执行一下,其他字母同理。
云服务器的关机
云服务器禁止关机,关是可以关,但是没法开了呀,其实要开也行,得去你的服务器的那个网页上也有办法。禁止关机的主要理由是在公司里,云服务器上可能还跑着7*24小时的命令,关 了就相当于把服务停掉了。reboot的功能是重启。
shell命令以及运行原理
操作系统分为广义操作系统和狭义操作系统,广义操作系统有操作系统内核(像centos,ubuntu这些都属于),外壳程序(shell命令行,windows里的图形化界面),必要的应用软件。狭义的操作系统就只有操作系统内核。
内核无法直接与人交互,人不擅长和内核直接交互。因此在内核外还会套一层外壳程序,一般就叫shell外壳,这个外壳程序跟用户交互,就譬如用户输入指令给外壳程序,外壳再将指令给内核处理,同理,内核执行完,会将结果交给外壳,外壳再交给用户。Linux里最典型的外壳程序就是命令行,全称为shell命令行(windows最常见的外壳程序就是图形化界面)。
外壳程序除了叫做shell外壳,也叫做命令行解释器,其作用就是将使用者的命令翻译给核心处理, 同时,将核心的处理结果翻译给使用者。
Linux里具体的shell外壳叫bash,如果说shell外壳是媒婆,是对所有外壳程序的一个通称,那么bash就是具体的一个媒婆叫王婆。所谓的外壳程序就是一个命令---bash,一个二进制文件。
外壳还有一个作用就是可以变相的保护内核,如果用户提出非法请求,外壳程序直接拦住不让你访问内核,就譬如输入了一个根本就不存在的指令,外壳程序直接弹出command not found!另外,外壳程序在执行的时候通常会以创建子进程的方式,将事情交给子进程做,这样万一在执行过程之中如果出错了就仅需要再创建一个子进程再去执行就可以了,不然外壳程序自己不就挂掉了,没法去做命令行解释了。
