Linux常用指令
在了解Linux常用指令前,我们需要知道一些预备知识:
1.在Linux中,一切皆文件
2.文件的属性也是数据,也要存储,所以哪怕一个空的文件,它也是有大小的。文件=文件内容+文件属性。
3.对文件的操作 = 对文件内容的操作+对文件属性的操作
常用指令
ls指令
语法:ls [选项] [目录或文件]
功能:前面说了,对文件的操作=对文件内容的操作和对文件属性的操作。 ls的功能就是对文件属性的显示 ,对于目录,该命令列出该目录下的所有子目录与文件,对于文件,将列出文件名以及其他信息。
选项:
-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录
-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件
-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件
-l 列出文件的详细信息。
-n 用数字的 UID,GID 代替名称。 (介绍 UID, GID)
-F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)。(目录类型识别)
-r 对目录反向排序。
-t 以时间排序。
-s 在l文件名后输出该文件的大小。(大小排序,如何找到目录下最大的文件)
-R 列出所有子目录下的文件。(递归)
-1 一行只输出一个文件。
上面标红的选项是常用的并且重要的选项
首先看一下什么选项都不加的ls命令:
什么选项都不加的ls命令,只是把当前目录下的文件和目录显示出来
这里可以看出,普通文件为白色,目录文件的蓝色
下面我们仔细看看这几个常用的选项
-l
-l
选项,能够列出文件的详细信息,显示更多的属性
这里可以看到,显示出了许多文件的属性,在这里我们需要知道一些基本的知识:
第一列第一个字母表示文件的类型,d
表示目录,-
表示普通文件
第五列表示文件的大小
第六列表示文件最近修改的时间
其实ls -l
也可以写成ll
,效果一样
-a
-a
选项,可以列出目录下的所有文件,包括隐藏文件
执行命令:
多个选项可以一起写,如:ls -a -l
,ls -la
. ll -a
下面执行ls -la
命令,看一下结果:
在截图中可以看到,和普通的ls
指令相比,-a
会显示出更多的文件
下面,我们介绍一下这些文件:
1.在Linux中,以
.
开头的文件叫做隐藏文件
2...
文件表示当前路径的上级路径,有了这个文件,我想返回上级目录,就可以用cd ..
十分简单
3..
文件表示当前路径
.
文件存在的意义:帮助用户定位当前目录下的文件,比如,执行当前目录下的可执行程序:./test.out
-d
指令ll dir1
会列出dir1
下的文件并且显示出他们的属性
但是如果我想去查看dir1
本身的属性,这样是看不到的目录自己的属性的
ls -d
ls -d
显示指定目录自己的属性,而不是它里面文件的属性
-F
在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)
pwd指令
pwd
功能为显示用户当前所在的目录,没有其他选项
这个指令很简单,下面说一定额外的知识点:
/home/hey
中的/
叫做路径分割符
Linux下,是以斜杠/
为路径分隔符
Windows下,是以反斜杠\
为路径分隔符
下面的是B站的链接:
https://www.bilibili.com/
,里面的路径分割符为斜杠,说明B站的服务器是使用的Linux系统
cd指令
cd指令的功能为改变当前目录,将当前工作路径改变到指定的目录下
Linux的目录结构整体是一个多叉树,其叶子节点,一定是空目录或者普通文件,路上的节点一定是非空目录
cd .. 返回上级目录
cd ~ 返回家目录
cd - 返回最近访问目录
cd ../dir1 相对路径
cd /home/hey/dir1 绝对路径
下面是对绝对路径和相对路径的说明:
绝对路径: 从/
开始定位到指定位置,具有唯一性的路径,叫做绝对路径
相对路径:以当前自己所处的路径为参照位置,来进行特定文件的定位,这种路径叫相对路径。如果当前所处的路径发生变化,那么相对路径就会可能失效
绝对路径比较长,但是不变,所以在一些固定场景中使用,比如配置文件
一般命令行输入,常用相对路径
whoami指令
whoami指令用来查看当前用户
在Linux中,2种用户:
- 超级用户root
- 普通用户
root用户的家目录为/root
所有普通用户账号都同意放在/home/
路径下,它们的家目录为/home/用户名
touch命令
语法: touch [选项] [文件]
touch的用法是创建一个普通文件
常用选项:
-a 或--time=atime或--time=access或--time=use只更改存取时间。
-c 或--no-create 不建立任何文档。
-d 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify 只更改变动时间。
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t 使用指定的日期时间,而非现在的时间
选项其实用得比较少,最常用的用法是touch test.txt
这样
mkdir指令
语法: mkdir[选项] [目录名]
用法:在当前目录下,创建一个目录
mkdir相当于在windows下建立了一个文件夹
目录在ls指令下显示为蓝色
建立一个名为test
的目录:
常用选项:-p
如果想一个指令建立多个目录,包括递归建立一系列上下级的路径,以及建立一些同级的路径
rmdir指令
语法:rmdir [选项] [目录名]
功能:删除空目录
注意事项: 只有具备当前目录操作权限的使用者才能进行删除
rmdir
只能删除非空目录
常用选项:
-p
:删除当前目录后,如果其父目录也变为空目录的话,就带着父目录一起删除
rm指令(重要)
语法: rm [选项] [文件/目录名]
功能: rm指令可以同时删除文件或目录
常用选项:
-f 即使文件属性为只读(即写保护),亦直接删除
-i 删除前逐一询问确认
-r 删除目录及其下所有文件
rm
指令不加选项时,只能删除普通文件,不能删除目录
rm
可以一条指令删除多个文件 例如:rm test1.c test2.c test3.c
如果只用rm
不加其他选项,删除时系统会进行询问:是否确认删除。如果不想让系统询问,那就rm -f
如果想删除目录,就需要加上-r
选项
所以既然rm
可以删除普通文件,也可以删除目录,所以相比于用rmdir
删除目录,rm
使用得更多,并且rm -r
可以删除非空目录
rm- rf
,递归强制删除
rm -rf /
,这个指令会强制删除linux中所有文件,慎用
man指令
Linux中有许多指令,某些指令又有许多选项,所以我们不可能全部都记住
我们可以通过man
指令,查看练级手册获取帮助
语法: man [选项] 命令
常用选项:
-k 根据关键字搜索联机帮助
num 只在第num章节找
-a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,查到了就停止停止,
而man -a printf当按下q退出,他会继续往后面搜索,直到所有章节都搜索完毕
手册一共分为八章,如果输入命令,没有写第几个手册,就从1到8,按顺序搜索指令
1是普通的命令
2是系统调用,如open,write之类的通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)
3是库函数如orintf,fread4是特殊文件,也就是/dev下的各种设备文件
5是指文件的格式,比如passwd,就会说明这个文件中各个字段的含义
6是给游戏留的,由各个游戏自己定义
7是附件还有一些变量,比如向environ这种全局变量在这里就有说明
8是系统管理用的命令,这些命令只能由root使用,如lifconfig
如果在man一些指令的时候,发现No manual entry for xxxx
,xxx为一些指令
原因是man-pages安装包没有安装
输入指令:
yum install man-pages
问题就解决了
cp指令(重要)
语法: cp [选项] 源文件或路径 目标文件或目录
功能: 复制文件或目录
cp test.txt test_backup.txt
常用选项:
-f #强行复制文件或目录, 不论目的文件或目录是否已经存在
-i #覆盖文件之前先询问用户
-r #递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,
#则一律视为普通文件处理 ,这里我们可以认为-r可以复制整个目录
-R #递归处理,将指定目录下的文件及子目录一并处理 ,这里我们可以认为-r可以复制整个目录
我们可以看到,-r
和-R
都是递归处理。
这里说一下-r
和-R
的区别:
实际上,
cp -r
和cp -R
在大多数情况下是等效的,都是用于递归复制目录。二者都能递归地复制目录及其所有子目录和文件。
cp -r:这个选项意味着递归复制。它会复制指定目录下的所有文件和子目录。
cp -R:这个选项也意味着递归复制,功能上与 -r 一致,复制指定目录下的所有文件和子目录。
那么为什么要设计两个一样的选项呢?
答案是,在某些特定的系统或历史背景下,-r 和 -R 可能会有不同的实现或行为
但是在现代的 GNU cp 实现中,-r 和 -R 已经被设计成完全等价的选项,所以在使用中没有区别。
所以,如果想复制整个目录的话,使用cp -r
或者cp -R
都可以
这里总结一下cp的用法,其实就两点:
- 如果想复制普通文件,
cp
指令就可以 - 如果想复制目录,
cp -r
或者·cp -R
都可以
mv指令(重要)
mv
选项主要有三个功能:
- 重命名
- 移动文件(剪切)
- 剪切并重命名
重命名:
当第二个参数是文件时,mv命令完成的是文件重命名
mv a.txt b.txt
mv a.txt b.txt
其实就是mv a.txt .b.txt
重命名的本质就是,把啊a.txt剪切掉,再重新站到当前目录下,并换名
移动文件:
移动文件是剪切而不是复制,mv后原文件会消失
如果mv命令中第二个参数是一个目录而不是一个文件时,mv执行的是移动文件(剪切)操作
mv a.txt ../
mv
也可以移动整个目录, 目录中的文件也都会一并被移动:
mv dir1 dir2
剪切并重命名:
如果第二个参数是一个目录并且有文件名,此时就是剪切并重命名
mv a.txt ../b.txt
其实,mv就是剪切并重命名,只不过没有指定名时,默认使用原名
常见选项:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖
说到重命名,其实还有一个指令
alias
,只不过这个指令,是给指令做重命名的
什么叫指令的重命名?我们来做个实验
指令都存储在/usr/bin中
但是这里发现,/usr/bin
中没有ll
的文件,但是ll
仍然可以运行
原因就是:ls -l
也是ll
,这就是重命名(起别名)
可以使用which
指令来查询指令在哪
可以看到,ls -l
被alias
起别名为ll
了
我们也可以使用alias
给指令起别名,例如我懒得每次都敲ls -la
,我只想敲lsa
,我就可以给它起别名
alias lsa='ls -al'
这里注意,=
的两边不要加空格
取消别名: alias lsa=’ ';
cat指令
语法: cat [选项] [文件]
功能: 查看目标文件的内容,打印文件内容到显示器文件中
相对比与ll
就是显示文件属性cat
是显示文件内容
-b 对非空输出行编号
-n 对输出的所有行编号
-S 不输出多行空行,把连续都行,压缩成一行
如果cat
后面不加文件,默认从键盘读取数据,再打印出来
cat < out.txt
,本应该是从键盘读取,现在不用从键盘读取了,从指定文件读取,叫做输入重定向
cat
不适合看大文本,只适合看小文本
什么算大文本呢? 项目、日志等等
下面介绍的more
和less
命令适合看大文本
more指令
语法: more [选项] [文件]
功能:查看文件内容,与cat类似
-n 对输出的所有行编号
q 退出more
more命令会让文件内容占满整个屏幕
按空格,可以向下查看,并且只能从上向下查看,一旦向下进行查看,就不能查看上面的内容
按上下建无作用,只能进行向下查看操作
输入/ xxxx
可以搜索文件中的xxxx
内容
因为more命令只能对文本进行向下查看,不方便,所以more
命令用的少
less指令
语法:less [选项] [文件]
less与more类似,less更强大,它解决了more的缺点
它可以随意浏览文件,按上下键,就可以前后翻看文件,会更容易查看一个文件的内容
-ⅰ 忽略搜索时的大小写
-N 显示每行的行号
/字符串:向下搜索“字符"的功能
?字符串:向上搜索字符串"的功能
n:重复前一个搜索(与/或?有关)
N:反向重复前一个搜索(与/或?有关)
q:quit
head指令
功能:查看文件前n行内容,默认打印前10行内容
语法: head [参数] [文件]
选项: -n(行数)
显示前n行
tail指令
和head类似,用来查看文件中后n行的内容
如果想要查看中间的内容,应该怎么办,例如查看一万行文件中的1000~1020行
方法1:
先用head -1020 log.txt >tmp.txt
,获取前1020行的内容
再用tail -20 tmp.txt
,就获得了1000~1020行的内容
但是这种方式需要建立临时文件
如果不想建立临时文件,就需要用到管道
方法2:管道
head -1020 log.txt | tail -20
|
是一个符号,表示管道。|
后面会被系统解释成“管道文件”
作用是将左边程序的输出交给管道文件,让右侧程序将管道文件督导自己的程序中
为什么叫做管道? 例如水管、油管,有一个入口一个出口,用来传输资源
管道还支持流水线操作cat log.txt | head -50 | tail -20
find -name指令(重要)
语法: find -name [文件名]
这个命令可以在指定的路径下,进行文件的搜索,并且真的是在磁盘中查找文件
find -name test.c
搜索test.c
文件
find -name *.c
,*
为通配符,搜索c程序文件
要注意的一点是:使用通配符的时候,要用引号引起来,不然会报错
其他的查找指令:
which
,在指令路径/usr/bin
下查找,这个前面在起别名的时候使用过
whereis
,在特定的系统路径下,查找含有指令名称的文件
grep指令
grep
为文本过滤工具,在文件中搜索字符串,将找到的行打印出来
grep
后面可加多个文件
grep '999' log.txt
,把文本打开,一行为单位进行读取打印,如果读取到的行不含有’999’,直接丢弃,含有‘999’的行就打印出来
常用选项:
-i:忽略大小写的不同,所以大小写视为相同
-n:顺便输出行号
-v:反向选择,亦即显示出没有搜寻字符串内容的那一行
-R 递归搜索,可以搜索一个目录下的所有文件
如果想知道某一个普通文件的属性,可以ll
文件所在的目录查看,如果在这个目录中有许多文件,我们用肉眼去寻找很废时间,所以可以使用ll
通过管道结合grep
指令
zip/unzip指令(重要)
zip:
语法: zip [压缩文件.zip] [要压缩的文件或目录]
功能:将文件或目录压缩为zip文件
unzip:
unzip xxx.zip
解压缩xxx.zip文件
unzip xxx.zip -d /tmp
,加了-d
选项,将文件解压缩到某一路径下
将t1.和t2.c压缩为d.zip:
将d.zip解压缩到d1中:
像上面压缩t1.c 和t2.c单个文件,可以使用zip
但是如果想整体压缩一个目录,就需要添加-r
选项,能够递归处理。否则,只会单纯地压缩一个目录文件而已
下面思考问题,为什么要打包和压缩?
- 能被打包压缩的,一定是一个整体,由多个文件压缩为一个文件,在存储或者传输的时候,不易造成文件的丢失
- 打包压缩,可以使体积变小,否则下载时间长,占的空间大
tar指令(重要)
打包和压缩有很多种,不只前面zip格式
用tar命名的压缩包后缀为tar.gz
,简称tgz
常用指令
-c 建立一个压缩文件的参数指令(create的意思):
-x 解开一个压缩文件的参数指令!
-t 查看tarfile里面的文件! #不解压,只看有什么文件
-z 是否同时具有gzp的属性?亦即是否需要用gzip压缩?
-j 是否同时具有bzip2的属性?亦即是否需要用bzip2压缩?
-v 压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f 使用档名,请留意,在f之后要立即接档名喔!不要再加参数!
-C 解压到指定目泉
其中-c -x -t -z -f
五个选项最重要
3个主要的指令:
tar -czf xxx.tgz yyy
将yyy打包压缩为xxxx.tgztar -tzf xxx.tgz
预览xxx.tgztar xzf xxx.tgz
解压
写2条指令尝试一下;
tar -czf code.tgz t1.c t2.c
将t1.c
和t2.c
打包压缩为code.tgz
tar -xzf code.tgz -C d1/
将code.tgz
解压缩到d1
目录下`
uname-r指令
功能:uname用来获取电脑和操作系统的相关信息,uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。
选项:
-a或-all详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称
面试题:问怎么查看体系结构?
答案是:uname -a
如何看待指令?
指令和可执行程序都可以被执行
指令实际上就是一个可执行程序,和我们自己写的可执行程序没有任何区别,我们可以实验一下,自己写一个代码,编译为可执行程序,将这个可执行程序移动到/usr/bin路径下(/usr/bin/路径是存放指令的路径)
所以
指令本质上就是可执行性程序,和我们自己写的代码编译好的程序没有任何区别
shell命令以及运行原理
我们先来看看bash命令行
输入指令的过程就是输入字符串
我们所有的指令最终都需要在操作系统中运行,但是操作系统的使用难度高,为了方便用户使用,就有了图形化界面和命令行解释器
而bash命令行就是一种命令行解释器
什么是Shell?
而这个命令行解释器的统称就是shell,在linux中,是bash sh shell,在windows中,是图形化界面
而shell为什么叫shell? 因为shell翻译为外壳,它是外壳程序,在linux内核(linux kernel)的外面
而shell的意思是:
1.将用户的命令翻译给核心处理
2.将核心处理的结果翻译,交给用户
3.保护操作系统,,对于用户的非法命令进行拦截