Linux基本指令

1.os概念,定位

    对于操作系统是什么,这个是要说一路的,今天主要说一些轻量级的结论。对于当下操作系统的概念其实每个人都在用,只是没有正式谈过。操作系统首先是软件,它是一款做软硬件资源管理的软件,重点在于管理,通过之后不断的学习会慢慢理解这两个字。今天介绍操作系统大概在计算机软硬件体系结构中处于哪一层以及我们平时哪些行为主要是做操作系统相关操作的。

    一般计算机软硬件体系结构中处于最底层的叫硬件,硬件就是可以摸到、看到、知道客观存在的东西,比如:键盘、显示器、主板、内存条等。早期计算机都是通过硬件电路直接去控制的,所以当时只有硬件,用户通过手动去进行硬件控制。后来随着发展硬件功能变的越来越完善,所以就需要一款软件对底下的硬件再做管理,要去管理的软件称为操作系统。但操作系统直接管理硬件比较难,因为底层的硬件变得比较复杂,比如硬盘容量变大、出现各种各样的接口、键盘鼠标功能的丰富等。所以每一种硬件要能被正确的访问,在操作系统和硬件之间必须多一个东西叫设备驱动,比如使用的鼠标是插USB的,电脑刚开机物理上刚把鼠标插上后,此时移动鼠标发现鼠标不会动,大概过1秒显示驱动加载成功后才可以移动,这说明插鼠标时操作系统已经加载了,此时鼠标和硬件属于连接状态,移动时不动是因为少了设备驱动程序,所以设备驱动的核心任务就是做硬件驱动方面的工作。

    所以可以这样理解,操作系统主要做的是各种各样的管理和决策任务,硬件是办事的,设备驱动是让硬件办事的。比如公司里程序员像硬件一样,项目经理像设备驱动会指派各种任务让程序员去完成,那为什么项目经理让程序员去完成这些任务,因为老板已经决策好做什么产品,什么时候让谁去做,老板就像操作系统一样,定好决策后给项目经理,项目经理按照决策指派程序员去执行。因此公司的这种体系结构就像硬件,设备驱动,操作系统间的关系,那老板为啥决策去做各样的产品,目的是给用户使用满足用户,所以应用软件就像用户一样,有对应的需求直接向操作系统说,使用操作系统相关的接口完成对应的开发。总的来说计算机整个体系结构中硬件、设备驱动、操作系统是三层软硬件资源。

    回过头再看,等于说现在已经有办事的,还有催着办事的,还有知道怎么办事的,所以合起来下三层为我们提供了一套软硬件服务。可是对于用户来说需求并不直接是操作系统,比如用户使用电脑是为了玩游戏、刷视频、聊天等,由于用户各种各样的需求,所以不同的应用场景下就诞生出了各种各样的应用软件,操作系统之上需要有各种不同的应用软件来满足用户的不同的应用场景,所以应用软件是在操作系统之上的。

    怎样衡量一个操作系统的好坏呢?比如玩游戏时操作系统每过一会就蓝屏一次、运行时非常卡、电脑上的数据随便被人拿捏等,这样的操作系统我们肯定都是不想用的,所以一个好的操作系统必须是稳定、快、安全的。稳定、快、安全都是由操作系统决定的,操作系统的核心工作是通过对下管理好软硬件资源的手段,达到对上提供良好的(稳定、快、安全)操作/使用环境。所以为了给用户提供良好的操作环境就必须要有操作系统。最后再总结一下对操作系统的理解:操作系统在计算机体系结构中属于一种承上启下的作用,主要核心工作是通过管理好底层软件对上提供良好的操作环境。

    现在理解一下我们在计算机上的操作,计算机体系结构是层状结构,(计算机上的行为也在应用软件那一层)我们在计算机上的所有行为都会转化成硬件行为。为什么这样说?比如我们平时写C语言程序调用print一个软件方法,它最后通过软件把数据打印到硬件这个显示器上;文件操作时向磁盘中写数据,写的代码是软件最终数据变到了磁盘中等。所有行为抛开现象到本质最终都是到硬件上的,所以任何软件行为最终都要去硬件上,那是怎样到硬件上的?

    是右边的,我们所有软件行为全部都要自顶向下贯穿计算机的软硬件结构才能从应用层到达硬件上。因为要经过操作系统,所以这句话的潜台词是几乎所有的软件行为,未来都和操作系统直接或间接相关。

2.Linux下基本指令

    Linux操作的特点就是纯命令行,但Linux也是有图形化界面的,只不过很少用,几乎都以纯命令行为主。除了Linux外Windows也是有命令行和图形化界面的,只不过Windows是面向普通用户的,必须是好用好玩的,所以Windows下几乎使用图形化界面。之前说操作系统和计算机商业化的发展时提到,其实早期不管苹果还是微软,对应的操作系统都是纯命令行的,没有所谓的图形化界面,当时使用计算机的都是科学家等专业人士,他们本身就具有使用计算机的能力。只不过乔布斯在参观施乐公司的实验室时看到有款产品带图形化界面,施乐公司把它当作一个炫技的产品,但乔布斯认为这是一个可以改变世界的产品,于是回去后就带团队弄图形化界面,微软看到后也立马更进,所以才有了现在看到的图形化界面。

    前面说Windows也有指令操作,那在哪里呢?Windows中打开cmd就可以看到命令行操作。苹果笔记本也有自带的终端,也就是几乎所有的操作系统都保存了可以终端操作的痕迹。大家都是这么来的,只不过给大众用的操作系统上带了层界面,拿微软举例,现在微软其实在自己的电脑中也早已兼容Linux,甚至可以在Windows下写Linux指令。

    所以无论是图形化还是指令操作本质其实是一样的,因为所有行为和操作系统有关,最终无论是图形化还是指令操作都是操作系统帮着做了很多工作,所以我们只是用图形化界面或者指令来触发让操作系统帮着做对应的工作,图形和指令是同一种产品只是体验不一样。

    最后思考一下先有指令还是先有图形化界面?肯定先有指令,就好比先有键盘后有鼠标,现有键盘,因为计算机诞生的第一个需求就是输入和输出,所以键盘变得有意义。后来有了鼠标然后运用到图形化界面,因为这样鼠标的诞生才有意义,因此硬件的产生顺序导致了操作产生顺序。所以指令操作更贴近操作系统。

    下面正式开始说指令:ls(list)指令,用于查看当前目录下的文件

    有可能什么也没有,也有可能充满各种东西都是正常的,反正ls就是显示当前目录下的所有文件列表的。如果有各种各样的东西,那么用空格分开的一个一个东西叫一个一个对应的文件。

    那什么是当前目录呢?再看一个指令叫pwd(print working director),pwd是用来显示当前命令在进行操作时所处的目录在哪里。

    如果是超级用户看到的就是上图左边的样子,如果是普通用户看到的就是上图右边的样子,其中XXX是用户名。

    这个就相当于在Windows中打开我的电脑,随便进入了一个路径,此时也不知道处于哪个路径,但没事,在Windows图形化界面的路径窗口中就能看到当前所处的路径。可以复制这个路径,下次再粘贴过来就能立刻跳转到指定的路径下,因此Windows图形化下所处的这个路径等价于在Linux中pwd所看到的当前路径。

    比如在Linux下想建立一个目录,就相当于在Windows下建一个文件夹。

    那在Linux下怎样创建类似的文件夹呢?

    用mkdir(make director)创建,空格后跟自己取的目录名就行。此时就建好了一个文件,在Linux中这个东西叫目录。在Windows中建立一个文件夹立马就可以看到,那Linux中建立的文件夹在哪里呢?此时就可以用ls来看,ls就是用来显示当前目录下的文件或文件夹的。

这里暂且用的配色方案,蓝色相当于目录,此时就看到了刚建好的目录。

    在Windows下建立好文件夹后,未来可能要在文件夹中放文件,所以双击就可以进入到文件夹里面,只不过现在里面什么都没有。那怎么知道已经进入到文件夹中了呢?从左上角的窗口路径中就可以看到当前在哪个文件夹里面。同理Linux中建立一个文件后天然的工作就是应该被用户进入的,因为用户需要在这个文件夹中创建其他文件,所以进入一个文件的指令是cd(change directory),空格后跟指定要进入的目录。

此时cd命令是进入对应的一个目录,那么怎么证明进去了呢?用pwd命令就可以就可以用来验证了

这是发现有/root/yyy,说明现在就在yyy目录下了。上面行为就等价于在Windows双击文件夹进入然后从窗口路径查看。

    当前处在yyy这个路径下,下面进入下一个话题,重新详细来看一看ls指令。指令是可以带选项的,当我们执行ls指令的时候可以带-l、-la等这样的选项,这样可以让显示呈现出不同的风格。因为当前路径下仍然是个空文件夹,为了后面好举例再创建dir1和dir2两个目录,再建立一个普通的文本文件test.txt,建立普通文件用touch指令,空格后跟名字。

此时就建立了3个文件和目录/文件夹,touch指令就特别像再Windows中建立一个文本文件,这个文件是未来可以在里面写东西的。这里ls后,默认只显示了当前目录下的各种文件的文件名,携带选项后可以显示出文件的更多属性,在说选项之前先了解这样一些事:

    实际上Windows中执行的某些Windows命令也是可以带选项的,比如关机指令shutdown,通过shutdown \?就可以看到各种选项,如可以用/s或/t设置关机时间(shutdown /s /t 120)等。shutdown后面的这些就属于当前指令后面的选项,对于指令携带选项其实是让同一个指令可以表现出不同的行为,选项可以理解为是指令的一种功能,可以通过使用选项让指令展现出不同的子功能,所以指令可以有选项。

    现在进到一个文件夹中,在文件夹中新建一个文本文档,里面什么都不写,那这个文件占不占磁盘空间呢?

虽然我们在文件里什么都没有写,但我们看到了这个文件的名称,修改日期,类型,大小。这些都是文件的属性,那文件的属性是数据吗?对我们而言,文件的名称、修改日期、类型就是字符串,大小是数字,这些都是数据,所以属性也是数据。这些数据都是被存起来的,要不然为什么电脑关机再开机依然可以看到这些数据,那是因为被磁盘记录下来了。所以现在要对文件有个正确的认识,文件 = 文件内容 + 文件属性,所以对文件的操作 = 对文件内容的操作 or 对文件属性的操作。未来ls所有操作都叫对属性的操作,之前用ls知道只显示了文件名,现在就知道显示的是文件的属性,只不过只显示了文件名这一个属性。

    下面来看一看ls -l的效果:

ls带l选项意思是显示更多的文件属性,虽然很多不认识,但知道ls -l就是显示了更多属性。再比如前面Windows中建立的文本文档,看不到文档里写了什么,因为没有打开文档,但可以看到属性,ls所显示的东西和这里属性的含义一样。因此未来执行ls相关操作大部分和属性有关,ls携带的选项未来都是帮我们对属性进行查看的。明白这些再看ls后面的选项就会从容很多,因为无非就是多少,哪些显示哪些不显示的问题。

    下面正式认识ls第一个选项-l,l有列表的意思,相当于列出文件的详细信息。ls只有文件名,带-l看到更多详细信息,这些详细信息都是属性,很多不认识暂时不考虑,文件名和文件创建或最近一次修改的时间以及月份前的文件大小还是可以认识的。ls -l可以被简写成ll

这两个命令是等价的。还有ls -a

可以有很多中书写风格,带选项时任意一种风格都可以。回到细节上,发现ls -a比ls -l在文件显示细节上多了一个点和两个点,下面先来介绍一个显示出的属性相关的细节:

显示文件列表时众多属性中第一列的第一个字母表示文件的类型,以d开头表示是一个目录,配色方案是蓝色字体,可以设置;以-开头表示文件是一个普通文件。带a与不带a的不同点在于多了一个点和两个点,在Linux中以点开头的文件称为隐藏文件。比如我们自己创建一个隐藏文件:

点也是目录,所以用mkdir创建,ls和ls -l都没有看到点,用ls -la后看到了点开头的文件都显示出来了。因此无论是目录还是普通文件以点开头在Linux中都叫隐藏文件,所以以后有私密文件不想让别人看到就可以创建文件时以点开头,也说明-a选项是可以显示出所有的文件包括隐藏文件。那Windows中有没有所谓的隐藏文件呢?也是有的:

所以Linux和Windows中都是有对应的隐藏文件的,只不过Linux中带-a选项可以显示出来,这个和Windows中显示隐藏文件是一个意思。

    上面了解到了以点开头的是隐藏文件,那一个点和两个点分别是什么呢?

当前在yyy目录里,进入dir1,pwd发现此时进来了,然后ls发现里面什么都没有,带-a选项后发现目录中照样有一个点和两个点,所以Linux下任何一个目录下面都有两个隐藏文件分别叫.和..。那一个点和两个点到底是什么?

pwd明确现在dir1目录里面,因为前面看到两个点的文件类型是目录,所以就cd进去,再用pwd看看到哪个目录里面了,不断的cd和pwd,最终发现只剩下/,再cd也还是/。通过观察很明显,每次cd ..都回退了一个路径,所以..表示当前路径的上级路径,..叫回退,也就是可回退到当前路径的上一个或副路径下。因此对我们而言点点非常重要,因为能进到一个目录里面最终还要回退出来,不能只进去出不来了,所以cd ..叫回到上级路径。

点点也相当于在Windows中随便进入到一个路径下,此时想回到上级路径点箭头一样,cd ..就等同于Windows中的回退。

    那一个点是什么呢?

回到yyy路径下,此时cd .后再pwd观察发现没有什么变化,再cd和pwd后依旧没有变化,说明一个点代表的是当前路径,那一个点有什么用呢?比如运行可执行程序,因为在当前路径下就必须./a.out,此时才能跑。因为在Linux特定目录下必须有.,因为通过点才能限定当前目录下的文件,用文件要提前找到它,因此当前目录下的文件可以告诉Linux去执行当前路径下的可执行程序。所以.存在的意义是帮用户定位到当前目录下的一个文件。

    总结一下上述:选项a用来显示隐藏文件,所有隐藏文件都是以点开头的,一个点表示当前路径,两个点表示上级路径,用一个点定位当前目录下的文件,用两个点进行路径的回退,这是ls -a所涉及的一些概念。

    当前处于yyy这个目录里,回退到上一个路径,此时想用ls -al查看yyy这个属性时发现ls默认不显示目录属性而是把内部文件以及内部文件更多的属性显示出来。如果说不要显示里面的属性,只显示本身的属性,那么就带-d选项,此时只显示yyy文件夹或目录自己的属性。

这就是-d选项,意思是将目录像文件一样显示,而不是显示其下的文件。 用法:ls –d 指定目录

    下面来看这副图:

进入到yyy里面,此时带-F选项,可以发现-F以可视化的形式给每个文件后面带了符号。带“/”表示当前文件是目录,带“*”表示当前文件是可执行的普通文件,什么都不带表示当前文件是普通文件。

    如上就是ls相关选项,关于更多选项后期慢慢详细了解,这里可以先大概看一下:

    前面说两个点是什么时提到过一直回退,回退到只剩下/是就无法回退了

对于/root/yyy/dir1来说,路径上的/叫路径分隔符,在Linux中路径分隔符用/表示。在Windows中也有路径分隔符,用\来表示:

分隔符开始和中间路径上的文件一定是目录,最后可能是目录也可能文件。当回退到/就再也不能回退了,所以/叫Linux的根目录,其中路径开头的/既是分隔符也是根目录。那怎么证明是根目录呢?

此时在根目录下,ls可查看根目录里的文件和目录,虽然很多也不知道是什么。若想看根目录的属性就带-d选项,这样就看到根目录是以d开头的,说明是目录。一个目录里是可以放目录或普通文件的,里面的目录还是可以继续放目录或普通文件的,所以这样就注定了Linux的整个目录结构一定是一个多叉树的样子。只要是树型结构有根结点是一点都不奇怪的,所以Linux的目录结构整体是一个多叉树,它的叶子结点一定是空目录或者非目录文件,路上结点一定是一个非空目录。

    所以我们所有的对文件或者目录的增删查改,本质都是对这颗多叉树的增删查改,这样也就理解了为什么cd ..一直到/就不能回退了。因为是树型,所以我们定位一个文件,通常用路径来定位,路径定位有唯一性。比如有一天学校布置了实验报告要求线上提交,小明因为贪玩最后一天才想起来这件事,于是给好朋友小刚打电话让小刚发发他的实验报告用来借鉴一下,但小刚不在宿舍,就给小明发了文件路径让小明自己去小刚电脑上找,顺着这个路径就可以找到。那为什么最后一定找到了呢?这个唯一性是怎么体现的?因为一个结点可能有多个子节点,但一个结点只有一个父节点,从上往下分支虽然多,但从下往上路径是唯一的。我们把从根/开始定位到指定位置,具有唯一性的路径称为绝对路径。了解了这个后,想进入一个目录就可以采用绝对路径的方式进入到指定的目录:

    再看这样一个场景:小明已经处于一个目录下了,于是小刚就说你先返回到上一级目录,然后可以看到实验目录,点进去就找到了。我们以自己当前所处的路径为起始参照位置,来进行特定文件的定位,这种路径叫相对路径。如果所处的路径发生变化,相对路径可能就失效了,绝对路径没有这方面的顾虑,因为就是从根开始走。

    现在开始想进入一个目录可以用绝对路径,也可以用相对路径。那怎么用呢?首先它们都可以定位,但绝对路径往往比较长,但是不变,一般在一些固定场景或配置文件中使用。一般命令行输入,比较常用相对路径。

    下面补充这样一个事情:

进入腾讯官网随便打开一篇文章,看到有图片有文字,实际打开网页看到的图片文字是一个文本文件,从服务器把文本文件拿到浏览器,浏览器渲染显示就看到了所看到的图片文字。其实找对应网页就是找对应文字,所以看到了上图的路径分隔符。上图的路径分隔符是/样子的,说明是Linux风格的,说明后端服务器的操作系统是Linux。最后要知道几乎所有的操作系统目录都是树状结构。

    接下来认识cd命令的其他用法,首先先认识一下whoami指令,whoami指令是用来查看当前登陆的用户是谁的。Linux下的用户分为超级用户和普通用户,超级用户就是root,只有一个,普通用户可以有很多。想退xshell可以直接退出,也可以用两次ctrl+d。退出重新登陆上来:

一上来默认所处的目录是/root,这个叫root用户的家目录。再用普通用户登陆:

一上来默认所处的目录是/home/yxx,这个叫yxx(普通用户)的家目录。也就是centos系统中,所有的普通用户,用户账号都会统一放在/home中。通过ls /home就可以看到每次新建一个用户都会在家目录下新建一个目录。Windows中也是有家目录的概念的:

c盘进去点用户再点用户名就可以看到,用户名前面的就是Windows下创建的普通用户所对应的家目录,也可以看到桌面也是文件夹。其实如果愿意Windows下也是可以创建很多普通用户的,每个用户可以用不同的桌面。把支持多用户登陆的操作系统叫多用户操作系统,Linux和Windows都是这样的。Windows也有超级用户,在图标上右击鼠标就可以看到以管理员的身份运行。了解以上类容后下面来看看cd ~:

cd带~选项意思是直接让对应用户进到自己的家目录,再看看cd -:

cd带-选项就是回到最近一次也就是上一次所在的路径。

    touch指令可以创建普通文件,mkdir可以创建一个目录。现在如果想创建一批目录或一串路径呢?

这样手动一个一个设置比较麻烦,当然有更好的方法,在说方法前补充这样一个知识:

先回到yyy目录下,用tree就可以将对应的目录结构以树状的形式显示,但直接用tree系统大概率没有安装tree,所以用yum install -y tree来安装,这里必须用root账号。安装好后就可以使用了,用法是tree+(当前目录/当前里面的目录),tree .表示显示当前目录下的:

现在想建立一批路径:

直接建立不可以,带-p选项后就可以一下建立一批路径了。现在想删目录怎么办?这里介绍一个指令叫rmdir(remove director),它只能删空目录,有内容时不能删除。

再介绍rm指令,它可以用来删普通文件。

超级用户可能有提示,询问是否确认删除,y表示yes,n表示no。Linux中删除就是删了,恢复成本特别高,所以平时多注意。如果不想询问可以带-f选项,这样就不会有提示了。

rm带-r就可以删除目录及目录下的所有东西,因为目录递归式定义,所以也要递归式删除,递归式删除时会不断提示,所以可以加-f来强制删除。

因此删除有rm就足够了,什么都可以删。

    下面补充一个点,在Linux中有一个符号叫通配符‘*’,通配符可以匹配任意名称的文件。

所以可以ls *,就会匹配当前目录下的所有文件;也可以ls *.c,就可以对什么什么.c的文件进行局部匹配,把.c后缀的都匹配上来;还可以ls test.*,把所有以test.开头的内容都匹配出来。这就是通配符所对应的概念,所以未来想删除当前目录下的所有可以直接rm * -rf:

此时就全部删完了。像ls或rm这样的指令后面是可以跟选项的,跟的时候可以写rm -rf 文件名,也可以rm 文件名 -rf,但建议用第一种,第二种有些地方可能不支持。

普通用户删的时候默认就删了,没有提示,如果想有提示可以加-i选项,所以-i选项就是在删除前做询问。

    下面认识一下man指令,在Linux中,因为Linux操作系统是用C语言写的,对我们来讲它未来提供的一些系统接口基本都是C的。有时候想查C语言官方文档,看某些函数怎么用或看一些指令的用法,可以通过man手册进行对应的查看。

比如上图man ls就可以看到ls的更多说明,看到ls可以列出目录的内容,还看到有很多选项介绍。

再比如man pwd,看到打印当前或工作的目录名;man rm,看到移除文件或目录。所以man可以帮我们更加详细地查看某些指令对应的说明,一般man后面跟着要看的指令就可以了。如果想查看一些C语言方面的接口怎么办?并且man也不会用怎么办?

可以用man man来看man怎么用,看到man是在线参考手册的接口。我们现在所用的云服务器所匹配的手册实际上是有手册编号的,默认情况下手册是1号代表查的是基本命令。未来可能会在man中查系统调用接口,所以就可以查2号手册,还可以通过3号手册查C语言。比如今天想看看C语言的函数printf,可以man printf:

此时发现printf是Linux中的一条指令,可以格式化并打印数据,怎么用呢?

printf指令也可以按照我们对应的要求来进行输出,注意这个指令和C中的没有一点关系。但这里想查看C接口的,所以应该查3号手册:

直接man 3 printf可能查不到,需要安装一下,安装后就能查3号手册了,此时Linux中提供的是C语言相关的printf,上面的(3)可以看到是3号手册。在手册中如果想下翻按回车键,上翻和下翻按上下箭头键也可以,想退出按q键就可以退出了。所以man后可以跟上对应的配置编号再带上对应的查什么东西,man pagenumber taregt。那如果不带编号是怎么查的呢?man后直接跟搜索对象没跟对应手册默认是按手册编号顺序去找,1号没找到去2号找…找到就停下来,都没有找到说明不存在。

    目前知道指令可以帮我们创建和删除,在Windows中还有一种行为叫拷贝,在Linux中有时候想进行一些拷贝怎么拷呢?

现在有mytest.txt,若现在相对该文件做拷贝,那有个问题,文件中目前什么也没有写,就算拷贝了也不知道是否拷贝成功,所以先对该文件内部写入对应的内容,这里先插入一个小话题:

在Linux中存在一条指令叫echo,echo这个指令可以将后面跟的字符串原封不动的显示出来。

本来echo会向对应的显示器打印,此时加一个大于号后面跟上文件名,再ll后会发现原来的mytest.txt文件大小变了。上述类容看到了这样一些现象:默认echo打印时会将自己输出的结果显示回来,带上大于号后,并没有在显示器中显示,而是被写到了test.txt这个文件中。那到是不是呢?再认识一个指令叫cat。

cat的作用就是打印文件内容,所以也进一步说明这个数据被写入到了文件中。根据上述,大于号其实叫输出重定向,代表的含义是本来应该显示到显示器的内容,打印到文件中。通过上述补充,已经有了一个有内容的文件。现在看看拷贝指令,如果拷贝普通文件直接cp src dest,也就是说把原文件拷贝到目标文件。

如上图所示,cp mytest.txt mytest_backup.txt,也就是说要把原来的文件在当前目录下拷贝出来,ll后发现当前目录多了一个文件,该文件大小和原文件大小一模一样。再cat新的文件,里面的内容也是一样的,也就是说拷贝普通文件时可在当前目录下进行拷贝。

若把一个文件拷贝到另一个文件但这两个文件同名会报错,所以原文件和目标文件两个名字必须不一样。那不想拷贝到当前路径,想拷贝到所在的上级路径怎么拷呢?可以cp src 绝对或相对路径。

cp ../mytest.txt后ls ../,此时看到上级目录里面多了一个mytest.txt,照样再cat ../mytest.txt,看到了里面的内容。说明确实把这个文件拷贝到了上级路径,那名字一样怎么不报错?因为不在同一个目录中,在Linux或Windows中常识告诉我们同一个目录下不能存在同名文件。

也可以rm ../mytest.txt,此时再ls ../,发现mytest.txt就不存在了,上述说的就是拷贝一个文件到同级或任意目录下。

    那如果拷贝的不是普通文件呢?

比如拷贝test1这个目录,tree一下test1,里面有2个普通文件还有一堆子目录。现在想要把整个test1目录拷贝:

这里用上述cp的方法,发现不可以,所以拷贝目录时不能直接进行拷贝,那怎么拷贝目录呢?

这里需要带-r选项,cp -r test1 test1_back,-r有递归的意思,因为目录本来是递归定义的,要拷贝肯定是把这个目录及其子目录全都拷贝给另一个目录,所以带-r选项。此时ll后发现有了test1_back,tree一下发现内容完全一样。

为了进一步证明,此时cat拷贝目录中的mytest.txt,发现也是一样的。有时候在root用户下有些选项可能没有遵守选项的规则,在普通用户下就遵守了。拷贝常用的选项就是-f和-r,想询问带-i,不想询问带-f,i和f同时出现听i的,因为为了安全起见。拷贝时-r可以直接拷,-rf更强硬的拷,未来递归式拷贝不要询问直接-rf就可以了。一般测试现象尽量在普通用户下看,su xxx(普通用户名),可以切换到普通用户,想退回来ctrl+d,就回到root用户了。

    现在可以创建、删除、拷贝文件了,这不就和Windows上的那些功能一样。下面再介绍一组功能:有一天创建好了一个文件,名字可能刚开始没有想好随便起的,后面想改名字,那怎么改呢?用mv src dest来修改:

此时ll后就能看到名字被改了,mv就像我们在Windows中右击鼠标,更多选项中的重命名一样。Windows中有剪切功能,拷贝是复制一份到另一个地方,剪切就是把这个东西拿走了。Linux也是可以实现剪切的:

可以mv mytest.txt ../到上级路径,ls后发现当前路径下没有mytest.txt了,再ls ..发现mytest.txt被mov了上来。

再cat上级路径的mytest.txt,里面的内容也是一样的,这样就完成了剪切。如果想把上级目录的文件再剪回来怎么办呢?

可以mv ../mytest.txt .,此时ls ..发现没有了,再ls发现当前目录又有mytest.txt了,cat一下内容也一样,这就是mv所对应的剪切的功能。那mv可以重命名,也可以剪切,怎么保证是在剪切还是在重命名呢?还有这样的情况:

这里mv mytest.txt ../test.txt后,发现上级目录里多了一个test.txt,当前目录中的mytest.txt没有了,这里是切剪并重命名,现在mv可以进行重命名、剪切、剪切并重命名。再看一个例子:

mv mytest.txt hello.txt,此时ll后看到以前的mytest.txt变成了hello.txt,那这里是剪切还是重命名?观察发现,如果mv hello.txt ../,后面只跟了一个目录,没有跟新的文件名,它就是单纯的剪切。如果mv hello.txt ../a.txt,后面有路径并带了名字,这就是剪切并重命名。如果mv a.txt b.txt,这叫重命名,但b.txt的写法等同于./b.txt,就相当于在当前目录下对它做剪切并重命名。所以在mv这里可以认为所有mv行为叫剪切并重命名,只不过没有指定名字时默认使用自己的名字。如果跟了名字就用新的名字,如果变成了其他目录就把文件移到其他目录,如果在当前目录下相当于把文件剪切,从当前目录剪切走再拷贝到当前目录以新的名字。mv功能上有剪切和重命名,但所有行为其实都是剪切或剪切并重命名。那目录名怎么改?

直接mv dir1 d1,还可以mv d1 ../,还可以mv ../d1 newdir,所以语义上普通文件和目录是一模一样的。

这里有个注意点,mv dir1 ../newdir,上级目录没有newdir代表是重命名,若有代表把dir1直接mv到newdir里面了,并不是用名字来代替。一般写路径时../xxx/最后的/带与不带都可以。

    ctrl+c有什么用呢?未来在命令行中做操作时有可能执行某些命令会让命令出现回不来的现象:

比如上面的例子在不断疯狂打印,输什么都没有反应,想终止按ctrl+c就可以终止了。所以ctrl+c的作用是终止因为程序或指令异常,而导致我们无法进行指令输入,此时无脑crtl c就可以了。

    现在增删查改都有了,最后强调一下,在Linux中rm进行删除时就真的删了,Linux中是没有垃圾回收站的。

上图所示可以改配置文件把rm指令重写了,但目前不推荐,因为好多东西还不知道,现在就简单看看,但其中有个指令很有价值。Windows中有垃圾桶,所以Linux中可以试着写一个简单的垃圾桶,其实垃圾桶说白了就是目录。Windows中垃圾桶可以看见是因为把目录进行了图形化界面的美化,展现出来的是看到的那样,实际上垃圾桶就是一个目录,Windows中清空回收站本质才是把目录中的所有文件删了。因为Linux中的rm指令危险,所以可以对rm进行重命名用mv指令替换,未来删文件操作,系统会转化成mv命令,简单举例就像rm test.c会转化为mv test.c 垃圾桶。系统中可以添加配置文件和shell脚本做到,但目前知识储备量少,不建议尝试。了解后主要介绍一个指令叫alias,它是一个可以重命名的指令。还记得之前提到过ls -l等同于ll,那凭什么这样说呢?下面先来补充一个小知识:1.你是如何看待指令的?2.我们在执行指令之前,我们应该先做什么?那指令究竟是什么呢?比如写了源代码test.c,是源文件,文本的,经过编译器编译变成了.out被执行的可执行程序。这里就发现指令和可执行程序都是可以被执行的,指令就是可执行程序。

胡乱输入指令,发现有提示说指令找不到。这里透露的细节是输入一个指令,系统要先找到这个指令,只不过没找到就报了错误,找到了就可以执行了,所以执行前要先在系统中查找对应的指令。既然要查找,所以指令一定是在系统的某一个位置存在的。那指令在哪里呢?指令是在/usr/bin/路径下面的:

所以指令是在系统中特定的路径下存在的,这些指令一定是某种可执行程序—C/C++/Python/shell等。比如我们有a.out可执行程序,此时mv a.out mycmd,如果愿意可以cp mycmd /usr/bin/,此时直接在命令行输入mycmd就可以像执行指令一样执行自己写的程序了。这种行为就叫安装软件,把写好的可执行程序弄到系统的搜索路径下,我们的软件就不用带路径就可以直接跑了。指令的本质就是可执行程序,和我们自己写的代码编译好的程序,没有本质区别。一般不要轻易安装,否则乱了后会把自己写的误以为是原有的指令。rm /usr/bin/mycmd后再直接输入mycmd就没有用了,所以把可执行程序从系统某些路径下删了的这种行为在Linux中就叫做卸载。

其实这种概念在Windows下一样的,Windows桌面上的图标是快捷方式,通过查看属性找到可执行程序在系统中的路径,拷贝到文件中就可以看到可执行程序,双击也可以打开。所以所有的软件,指令,工具都是可执行程序,指令就是别人写好的可执行程序放到了系统中仅此而已。综上所述指令的本质就是文件,只不过是可执行文件罢了,就是直接安装到了系统的某种路径下,可以在执行时自动去找。

因为指令是存在系统中的,但发现ll usr/bin/ll时系统中没有这个命令,但平时直接使用ll照样可以跑,这是怎么回事?下面来看一个指令叫which,用于查看指令对应的路径。

which ll时发现路径是ls的路径,前面有个alias,说了ll等价于ls -l,因为ll是ls -l的别名。所以指令有时候为了方便做输入,如果愿意可给指令进行重命名,所以which ll看到在系统中对ls -l命令起了个别名。这个指令自己怎么用呢?

比如alias cmd='ls -l -a',现在输入cmd和输入ls -l -a的结果一模一样。

which cmd后看到是做了重命名,根上用的还是ls,这就是重命名。那命名以后不想要了怎么办?

可以alias cmd='',此时再cmd发现没什么用,再which cmd也看到什么都没有。如果关闭xshell再重新进入,此时也发现没有了,所以alias是临的,ll不临时是因为写到了配置文件中,这个以后就懂了。

    下面继续详细认识cat指令,了解这个指令前再补充一个知识点:在Linux中前面讲了一个概念叫输出重定向,本来echo将数据打印到显示器上,后来用了>大于符号将内容显示到了文件中,我们说这叫重定向。在Linux下一切皆文件,也就是Linux中我所看到的所有东西都叫文件,比如显示器,键盘等。对我们而言,文件是看到的磁盘上那些文件,但显示器等是文件是什么意思?平时显示器就是一个可以打印东西的,是程序想办法向显示器打印,站在程序的角度,向显示器打印其实就是向显示器写入,那要是读取呢?不会从显示器读,所以在我看来它的读方法是空的。对于键盘而言,如写scanf时从键盘输入,相当于程序在键盘中读数据,所以认为键盘提供了读方法,它的写方法是空的,而普通文件有正常的读写方法。虽然大家的读写有差别,但根上大家都可以具有读写方法,所以在Linux中凡是能够被读或写,那这样的设备文件未来也把它当文件。

所以现在看echo "hello Linux",以前说echo指令是把后面跟的字符串打印到了显示器上,现在说法变为了echo指令默认把字符串写到了显示器文件中。所以echo "hello Linux" > out.txt就是把本应该写到显示器文件的内容写到了普通的磁盘文件中,这种行为称为重定向,cat out.txt后也可以看到内容。cat这个指令用来打印文件的内容,echo后面写的所有东西在echo看来全都会原封不动的打印出来。cat后面跟文件名,作用是打印文件的内容,将数据写到显示器文件中;ll是打印文件的属性数据写到显示器文件里。

现在echo "hello Linux" > out.txt,写了很多次,当cat时发现里面只记录了一条。

再echo "hello" > out.txt,再cat后发现前面的内容又没有了。所以输出重定向有一个特点,向目标文件进行写入的时候会覆盖写入。实际上在重定向的时候做了两件事情:1.清空文件。2.写入新的内容。

所以想清空一个文件有种简化的写法:> out.txt,在cat后看到里面就没有东西了。>左侧什么指令都没有,这不重要,有大于符号就代表重定向,虽然什么都没有写,但要先打开文件,打开时默认就清空了。现在可以重定向了,但不想清空,想让文件内容不断增多该怎么办呢?

可以echo "hello Linux" >> out.txt,两个大于符号可以多次写,再cat后也看到了多次写入的内容。这种重定向的行为叫追加重定向,就相当于写入之前先打开文件,打开后不做清空,每次写入时向文件结尾处开始写入,这种方式叫追加重定向。echo默认换行输入,不想换行可以用printf,如printf "hello" >> out.txt。

当cat后面什么也没有跟的时候,现在输入什么就打印什么,那什么也没跟cat默认从哪里读呢?又把数据写到哪里?上图的现象已经说明默认从键盘文件读数据。

所以如果cat < out.txt,此时也能读数据,所以本来应该从键盘文件读取,现在不用从键盘文件读取,从指定的文件读取,这是输入重定向。那cat out.txt也可以直接打印,为什么要cat < out.txt,先暂时认为它们没有区别,这里只是多了一种打印文件内容的写法叫输入重定向。

无论是输出还是追加重定向,写的目标文件不存在默认会建立,所以创建一个文件不一定要用touch,可以用>newfile.txt。

cat -n newfile.txt,带-n选项会对输出的结果进行编号,往newfile.txt中写入多个数据和空行,发现空行也带了编号。

如果不想给空行带编号,可以cat -b test.txt,只给非空的代码编号。还有cat -s tets.txt,可以不输出多行空行,意思是有连续多行空行压缩成一行展现出来。当然也可以cat -sn test.txt,也可以cat -bs test.txt。

    cat打印文件时,若这个文件比较短可以一览无余,若是文件比较长呢?

这是用命令行脚本构造的长文件,此时用cat看这个文件,比如要看第1000行,显示器中也没有第1000行,也不容易看到,所以cat不适合读大文本,cat适合看小文本。那谁合适看呢?这里学一条新指令叫more。

输入more newfile.txt回车后,它会将显示的内容文本打印满一屏幕,占满一屏幕后不再打印,按回车会自动做下翻,适合自顶向下进行查看,退出按q就可以了。

more也可以带更多选项,如more -500 newfile.txt,会按要求到第500行停下来,也会把一屏幕打满,因为这里从0开始的,所以最后到第499停了下来。

more只能向下去翻,也可以/9999,这样斜杠加数字可以在more的场景中做搜索,文本查找会把9999所对应的内容展示出来,skipping表示跳过了许多东西。move命令可以让我们逐行下翻把大文本展现给我们,其实move命令用的不是很多,推荐使用less命令。

less命令的功能是更强大的,如less.txt,发现有效内容打满了一屏幕,回车可以下翻,上下箭也可以翻,所以less可以进行大文本的上下翻。

使用时可以/999,回车后看到也可以做文本查找;还可以?899,可以向前去搜索,进行文本查找,退出时按q就可以了。上述说了more和less确实可以看大文本,可我们为什么要看一个比较大的文本呢?什么都属于大文本呢?有些项目比较大,不想用记事本打开一个一个看,就像搜搜看有没有想要看到的片段;日志,服务器挂了打开日志查查为什么,这些都属于大文本。下面再来看一个指令叫head:

比如现在不想像刷屏那样整个屏幕看,就想简简单单看前n行,就可以head newfile.txt,它默认提取一段文本的前n行,默认是10行。可以head -3 newfile.txt,此时就提取文本的前3行。比如有个日志,它是个软件,运行时经常要打印的一个东西,就好像一个人在工作,每隔一段时间都给领导汇报一下说目前进度是多少,一切正常。有一天这个软件运行时突然退出了,作为领导要查怎么不运行了,不是说好每天要报告信息,可这个日志信息可能从去年打印到现在有10万行了,想知道是什么原因退出了不应该从头查看,而是要从后看。

所以再来看一个指令叫tail,tail newfile.txt,可以提取该文件的末尾数据。也可以tail -5 newfile.txt,可按要求去提取指定的行。有了这些概念后下面看这样一个问题:现在不想看开头,不想看结尾,想看中间,比如看1000行到1020行怎么看?

最先想到的是直接less newfile.txt,再/1000就可以看到了。但今天就不想用less或more这样的工具,想用head或tail,不光要看到1000行到1020行,还要想办法把这个文本片段截出来,那应该怎么做?

首先要提取1000行到1020行,没法直接提取,但头部可以提取,所以head -1020 newfile.txt,此时前1020行就有了。再head -1020 newfile.txt > tmp.txt,对我而言这些信息也可以重定向到tmp.txt文件中,此时cat也看到前1200行保存了进去。此时再tail -20 tmp.txt,就可以把1000到1020行的内容拿到了。

所以head或tail加重定向就能做到一个文件任意片段都能够截取了,这种方案是要创建临时文件,这个文件是存在的,那如果不能创建临时文件怎么办?下面再补充一个知识叫管道:

可以head -1020 newfile.txt | tail -20,此时就拿到了所要的中间部分,我们把|称为管道文件。|在对应的指令上是一种符号,后面会被”系统“解释成为管道文件,这个管道文件不会真的在磁盘里存在,是一种内存及文件。它的作用是把左侧程序输出交给管道文件,让右侧程序从管道文件中把数据读到自己的程序中。那什么叫管道?生活中听过自来水、天然气管道等,生活中所有的管道一定有入口和出口,生活中管道用来传输资源。在计算机中之所以被称为管道正是因为它有同样的功能,把左侧指令输出结果写道管道里,右侧指令从管道出口把结果拿出来。计算机中数据也是资源,相当于你处理完下来该由我处理。读文件时对文件数据内容做修改,不是直接去磁盘改数据而是先把文件加载到内存里读取,修改完后再写回磁盘。所以所有文件在某一生命周期内都是内存文件,只不过磁盘文件要定期刷到磁盘上,管道不需要,仅此而已,上述先简单理解。那管道可以怎么用?

比如可以cat newfile.txt | head -50,把内容写到管道后再交给head提取前50行。可以后面继续加|变成cat newfile.txt | head -50 | tail -20,帮我们拿到尾部20行,所以管道通常可支持流水线工作。

    下面要谈的是时间相关的指令,这个指令比较多,这里重点谈的是时间戳的概念。在说指令前插入一个小话题:以前为了登陆Linux都采用指令+某某用户@公网IP的方式,其实可以把公网IP和信息配置到xshell中:

点击左上角的新建,点开后名字随意起,主机后写公网IP,说明后随便写,协议不管,点确定就可以了。下次打开xhell时就会看到会话中多了一个,选择链接后默认第一次要输入用户名,点记住我后再点确认,然后输入密码就可以登陆上来了。

配置好以后不想要了点文件在会话中选中它,单机右键删除就可以了。此后也建议不再用root账号而用普通账号,因为用root账号学习体验不是很好,root没什么报错,普通用户可能见到各种阻拦。下面建立一个目录来完成测试,现在正式开始:

首先认识的指令叫date,date指令是用来查看Linux一些相关的时间的:

我们需要有一个日志的概念:以前学校老师可能要求写日记,日记中有个重要的东西是时间。在计算机世界里时间也是很重要的,因为时间可以在出现问题时确定产生问题的时间点,根据时间来评估一些问题。程序运行到自己的每一个关键时刻都要自己打日志,日志里通过包括时间、日志等级(woring、error、debug)、日志具体信息(打开文件失败?网络读取失败?)以及其他业务信息。日志所涵盖的信息最终会以行为单位进行打印,把这些信息写到一个文件中,这个文件就称为日志文件。最终打印的很多内容会放日志文件里,里面进行筛选时时间也是一个重要指标。在Linux中想显示时间的指令就叫date,date指令的显示风格对我们来说看起来不舒服。因此date可以支持按照我们需求进行信息提取,支持将时间转化为我们喜欢用的格式之一,提取有效字段时用date +,如:

所以可以按照我们的需求以喜欢的样式显示时间,加号后的不同标记有不同含义,标记间的分隔符可以随意写,但不能用空格,因为会被认为是两个参数。下面看一下date +%s:

多跑上几次,发现显示了显示了很长的整数且每次都不一样,这个整数就是时间戳。首先我们要知道这个世界上的时间是人为定义的,因为阴历、公历算法时间不同,地球上国家所处片区不同,大家在时间设定上是有差别的。因为全球时间不统一就很难进行互联网级别应用,比如两个不同片区的人互相发消息,聊天时间是对不上的,所以互联网必须保证时间是统一的,所以就定义出一个概念叫格林尼治时间,在自己国家以格林尼治时间为基准按时差把时间调整过来就可以。时间戳指从1970.1.1午夜12:00累计到现在的秒数,所以这个数字是单调递增的。所以未来一些核心场景中比如日志用的时间不是想前面年月日那样,而是用时间戳,因为单调递增所以很容易进行范围查找。那怎么样把数字转化为我们认识的时间呢?

可以date -d @时间戳,转化为系统默认打的时间,也可以按照喜欢的合适打印。相当于以前没有  -d @时间戳时是从系统时间直接获取,每次获取的是最新的,有-d @时间戳代表从@后面获取,并可以转化为自己想的格式。@0的时候时间是8点,因为格林尼治时间是欧洲定的,所以有时差。所以大家以一个同样的时间点按自己时区把本地互联网中时间做本地调整,这样时间就可以既满足本国使用,又满足全球通信的需求。

    下一个要学习的指令是cal指令,它是Linux中的日历。可以cal -3,查当前月和之前一个月与之后一个月的日历,也可以cal 年份,如cal 2025,把2025这一年的所有日历打印出来。

    下一个指令是find指令,它在Linux中是对应着搜索的指令,可以用find指令进行系统上的搜索,但find指令的选项非常多,这里主要说的是find -name。比如我想搜一下创建过多少个test.c文件,就可以find ~ -name test.c:

它会从根目录下搜索test.c,此时就会把所有test.c文件路径显示出来,这个就叫在特定目录下进行文件查找的一条命令。也可以find ~ -name *.c:

此时会把系统中特定目录下的所有.c文件都查到。也可以find /usr/bin/ -name ls找对应文件:

另外可以find /usr -name pwd:

使用find有时候查某些路径目录下的文件时会出现Permission denied这样的报错,如果是root大概率没这样的问题,普通用户只有在自己的家目录进行操作查自己文件时就能正常查(/home/XXX),前缀不是这样有时候会受系统的约束就不让查了。总之find可以在指定的路径下进行文件的搜索,它是真的在磁盘文件中查找。再补充几个知识:

之前提到过一个指令叫which,which也可以查找,比如which ls,它是在指定路径下(/usr/bin)查对应的指令文件。还有whereis,比如whereis ls,它可以在系统特定的路径下查找,既可以找到可执行程序,又可以找到手册,安装包压缩包等之类相匹配的。

    下一个指令叫grep

构造一个大文件,这个文件是以行为单位进行打印的,现在我们先把含9的行全部拎出来,就   grep '9' log.txt:

此时就把整个文件中包含9的行全部打印出来了,再如grep '9999' log.txt:

此时就把必须包含连续4个9的行拎出来了。grep是一个行文本过滤工具,它的做法是把后面跟的文件打开,按行为单位,把这个文件的内容进行读取并打印,只不过读取时它有条件,如果判断到读取行的内容并不包含单引号里面的条件就直接丢弃它,如果包含条件才进行对应的显示打印,所以最总就可按行过滤了。为了更好的演示grep,下面说一下:对于当前的grep工具它可以对文本行进行过滤,它有对应的选项可以支撑我们做过滤,因为文件大,这里清空log.txt:

下面对log.txt文件写一点内容方便一会做对比:

这里nano log.txt,先用记事本打开,写完数据后ctrl + x退出,yes保存,保存好后cat log.txt就会看到写的内容。现在比如想找包含world的关键字,此时就grep 'world' log.txt,log.txt是要过滤的文件

其中grep会把该文件打开并读取,以world作为过滤的关键字进行过滤,也就是它会把这个文件按行读取,按行读取时做子串(world)匹配,如果匹配上就把它打印出来,匹配不上就把行丢弃。还有grep -v 'world' log.txt:

这里过滤的关键字是'world',但是带-v发现没有world,所以v有点像reverse逆转的意思,就是这里变成了把包含world的行不打印,不包含的打印出来,这就是-v选项。还可以带选项-n,比如    grep -n 'world' log.txt:

可以对匹配到的行进行带编号,还可以grep -n '' log.txt:

都不写就是空串,所以就什么都可以匹配。也可以grep -nv 'world' log.txt:

可以grep 'bit' log.txt,也可以grep -i 'bit' log.txt:

i有ignore忽略的意思,这里就是把大小写忽略,都显示,所以-i选项叫忽略大小写,以上选项都可以组合用。那grep这个东西有什么用呢?下面说几个场景:比如现在有个文件log.txt,我可以cat log.txt打印它,也可以cat log.txt | grep bit,也可以cat log.txt | grep -n bit。

所以grep可以以携带文件的方式进行查找,也可以合并到管道中充当管道的一部分,只不过细节是管道这不用带文件名了,文件默认是管道,上一个程序会把数据写到管道文件里面。再比如以前写了很大的代码,现在不想打开这个代码,就想知道它的main函数入口在哪里,此时就可以:

如果想查多个路径下的文件中main函数入口在哪里,此时后面跟多个文件的路径就可以了:

此时就找到了,还可以找家目录下的:

这里说它是个目录,所以要再带r(递归)选项:

此时就会在指定目录下把所有包含main的地方找到,还会显示文件路径。grep还可以配合管道进行系统中程序/进程的一个查找,如ps ajx | grep sshd想找sshd:

此时就找到了系统中的sshd。ssh就相当于windows下的客户端,sshd相当于Linux上的一个服务器,为什么我们远端可以登上Linux机器主要因为有这个服务器的存在。那什么是客户端和服务器呢?比如平时刷抖音时我们以为只是单纯的刷,其实是我们拿着抖音的手机App(手机上装的所有App都叫客户端)请求服务器把信息发回来才能看到。服务器就很像我们现在用的云服务器,服务器分硬件和软件两个概念,我们的请求会发到远端的服务器下,这个服务器就是云服务器,可暂时理解是硬件,但服务器上也要装对应的软件服务就叫sshd。

所以平时windows登陆远端机器时,笔记本上搭载的是windows操作系统,服务器搭载的是centos/Ubuntu等品牌下的操作系统,客户端中要装xshell,它跑一条指令ssh,它最终可访问服务器,而服务器上有个服务叫sshd,所以平时输指令登陆时通过ssh通过服务推过去,sshd做受理,对比条件允许后就可以登陆了,这里先简单理解,后期会更详细的说。

    下面再来看看zip和unzip指令,再说这个之前我们再谈一个概念叫打包和压缩,打包是把所有东西装在一起,压缩是把装在一起的东西进行合理摆放,按照某种特定的算法压缩,相当于挤压它的空间,如果东西是一定的那占有的空间会比较小,空间不一定东西一定那可能会在同样的体积中装更多东西。那为什么要打包和压缩呢?可以先看看生活中的故事:比如在刚上大学时父母帮我们收拾行李,爸爸在帮我们收拾的时候把东西随意的就放进了包里,这个行为就叫打包,妈妈看到后很不爽的说怎么收拾行李的?这么大的包装这么点东西,于是把包里的东西摆放好,合理的装了更多东西,这个过程就是压缩。我们拿着包到学校后拆包,先把压结实的东西放开,这个过程叫解压,再把东西一个一个拿出来,这个过程叫解包。所以为什么打包压缩呢?在计算机中:1.能被打包压缩的,一定是一个整体,由多个文件变为一个文件,变成一个文件的好处是不容易造成文件缺失。2.打包压缩,体积会变小,体积大会让下载时间变长,存储占据空间变大。因为这两个理由诞生了很多打包压缩的工具,所以注定在服务端是要有的,客户上传的东西也可能要打包压缩,所以Linux上也要打包压缩的工具,因为Linux充当服务器的时候,也需要各种网络应用场景满足通讯需求。正因如此Linux上常见的压缩工具压缩文件内容很多,这里主要挑的说的一个是zip和unzip,另一个工具叫tar命令来进行打包压缩。下面来看一下Linux中是如何进行打包和压缩的,这里多弄点文件方便做样例:

至此lesson4下就有了整个一个目录结构,可以对普通文件进行打包压缩,这里就一次到位把整个目录和目录里的所有内容全都打包压缩。

为了更好的测试这里以当前目录和上级目录作为测试地点。首先要对整个d1目录进行打包,打包时用的指令是zip指令,用法是zip test2.zip test2/*,意思是后面跟上打包的路径形成一个.zip文件。所以这里就zip d1.zip(打包后的文件) d1(要打包的目录):

ls后发现有了一个.zip为后缀的压缩包,再mv d1.zip ..,把它移动到上级目录。此时cd..再ls就看到了打包好的文件。下面再尝试解包看能不能恢复出来,unzip d1.zip:

此时ls后发现当前目录下多了一个d1,再tree d1发现解压解包后只有一个目录,剩下的东西都不在,因为zip d1.zip d1时它默认把d1当一个文件打包了,所以解包后只有d1。如果后面是普通文件这解的时候就没有什么问题,但这是目录,它只解出一个目录本身,里面空的什么都没有,说明打包不正确。所以删了:

那怎么对d1打包呢?应该是zip -r d1.zip d1,-r选项是要递归式的进行打包并压缩:

此时看到把d1及里面的内容都添加进来了,ls后看到有了一个d1.zip,再mv d1.zip ..移动到上级目录,再cd ..,ls,再unzip d1.zip,此时多了个d1,再tree d1发现东西都有了,再cat之前写的内容发现也在,这样就完成了对一个目录打包压缩的工作。

再删除来看一个下一个问题,怎么把d1和log.txt整体打包压缩呢?

可以zip -r d1.zip d1 log.txt,ls后发现也形成了d1.zip。再rm -rf d1 log.txt,此时只剩压缩包,再用unzip d1.zip把它们恢复出来,最后tree和cat后发现内容都有。除了上述的打包压缩还有一种场景是解压到指定路径:

当形成d1.zip压缩包后,下面想解压到指定路径,比如创建一个test目录,想把压缩到的内容解压到test目录里面但又不想进去怎么办?此时就unzip d1.zip -d test/,-d指明解压到的目录,意思是把解包出的内容放到test目录里面,再tree test发现内容也有。有的服务器可能没有装zip和unzip对应的两个指令,如果没装就以root方式登陆,也可以su或su -输入密码变为root(ctrl+d再退回普通用户),再yum install -y zip unzip就可以了。

    下面进入下一条指令叫tar命令,输入tar --version:

Linux系统中tar命令一般都是内置的,tar命令有非常强大的打包和压缩功能,也有非常丰富的选项。这里清空一下继续用当前目录做tar命令的演示:

比如现在想打包和压缩,只不过不想用zip的打包压缩方案,这里引入个小话题:打包和压缩的方案有很多种:

所以以后Linux中遇到压缩包要解压后缀不认识,我们直接搜索就可以了。这里重点在说一个方案:比如想对d1和log.txt整体打包压缩,就tar czf code.tar.gz d1 log.txt:

相当于tar命令用czf把后面的文件打包压缩形成一个code.tgz的文件,ls后看到形成一个code.tgz的压缩包,有了压缩包后也可以使用对应的选项去查它,如tar tzf code.tgz d1 log.txt:

c选项代表的是我们要执行打包和压缩这个动作,把c换位t相当于不解压,不解包,想看看里面有什么。

现在把其余的删了,只留下一个压缩后的压缩包,接下来想解压并解包就tar xzf code.tgz:

此时ls发现d1和log.txt都恢复出来了,tree d1发现也是完善的。总结上述,这里把选项分开说会有点混乱,所以这里把它们当整体说了3套:

那怎么解压到特定路路径下呢?默认是解压到当前目录,比如想解压到上级目录下就:tar xzf code.tgz -C ..:

此时cd ..到上级路径发现多了d1和log.txt,再tree d1和cat log.txt发现内容都在,所以-C可将压缩包解压解包到指定路径下。

    下面来说Linux有个命令叫bc命令:

输入后可以进行算数,不用了quit一下就可以了。它其实就是Linux下的计算器,同理Windows下也是有自己的计算器的,可以搜索或命令行中calc调出来,只不过windows做了图形化界面处理可以点击使用,Linux是命令行的。其实bc还有其他用途如:

以前echo "1+2+3+4"时还是原样子的打在屏幕上,现在可以配合管道和bc将结果打在屏幕上。

    接着来看下一个,我们已经用了一段时间Linux,问题是Linux系统它的内核版本是多少?包括它的体系结构是什么?再介绍一个命令叫uname,uname -a可以显示所有信息:

之前的所有指令都是在软件上让我们知道怎么操作,怎么创文件,怎么查文件内容等,现在问题是系统相关的信息怎么查?uname -a默认可以查到当前的主机名(VM-8-2-centos),内核版本(3.10.0),el7代表centos7,x86_64代表体系结构,64位系统。当有人问怎么查体系结构时要uname -r:

这种做法就相当于在windows中打开此电脑从属性看一样。Linux中查内存可以用free命令:

可以free -k(按kb的方式),可以free -m(按mb的方式),可以free -g(按G的方式)。还可以查磁盘:

现在云服务器默认有一块盘叫vdal,这是云服务器分配的虚拟盘。还可以查cpu:

有lscpu这样的命令,总之硬件方面也是可以查的,以上先做了解。

    下面来认识几个热键,什么是热键呢?就是这个键经常被访问,经常用。第一个Tab键,比如输入w,快速按两下Tab键,它会列出所有以输入字符开头的指令显示出来让我们去选择:

再比如输入whic,Tab一下会自动补全并带空格,这叫指令的补全:

想看到Linux一共有多少条指令可以快速Tab两下,但可能没有反应,这很正常。在说一个热键叫ctrl + r,它可以进行历史命令搜索:

比如输入while,它会自动匹配历史输入的命令,不想搜了就cirl + c。所以Linux会把历史执行的命令记录下来,可以通过ctrl + r搜索,回车就可以把要的命令都找到了。下面再看一个热键ctrl + c,它可以终止异常进程。下面简单提一提:到现在这里还没有说过在Linux下怎么写代码,不过见过叫nano的文本编辑器,它就是Linux下的记事本,可以nano --version试一试有没有安装:

如果没有装就yum install -y nano,如果还失败就先这样yum install -y epel-release,再安装。此时创建一个test.c,里面写些内容:

然后gcc test.c,编译通过有了a.out的可执行程序,然后./a.out就可以运行它:

这就是nano,运行后进入了死循环,此时ctrl+c就可以终止异常行为。ctrl+d叫退出终端登陆或退出用户,比如退出xshell出来点差退出或还可以一直ctrl+d。根据前面的学习我们也知道ctrl+r可以搜索历史命令,那就注定了Linux系统一定记录了历史命令。如何确认当前历史命令呢?

可以用history,它会记录下历史上所对应的命令,还可以histroy | head -10:

Linux会默认记录最新的1000条指令,所以每次有新指令都会修改。

    Linux中也有关机指令,叫shutdown,它也有对应的选项。Linux操作系统(服务器),永远不关机。Windows下也有shutdown关机命令,可以shutdown \?来查对应选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值