Linux目录结构
Linux的目录结构是一个树形结构。Windows系统可以拥有多个盘符,如C盘、D盘、E盘。而Linux没有盘符这个概念,只有一个根目录/
,所有文件都在它下面。如下图所示:
Linux路径的描述方式
在Linux系统中,路径之间的层级关系,使用:/
来表示,如D:\C语言代码\imitate_function\imitate_function
。
而在Windows中,路径直接的层级关系,使用\
来表示,如/usr/tmp/hello.txt
。开头的/
表示根目录,后面的/
表示层级关系。
Linux命令基础
在学习基本指令之前,我们要先知道什么是命令和命令行。
命令行:即Linux终端,是一种命令提示符页面。以纯“字符”的形式操作系统,可以使用各种字符化命令对系统发出指令操作。
命令:即Linux程序。一个命令就是一个Linux的程序。命令没有图形化页面,可以在命令行(终端中)提供字符化的反馈。
Linux命令格式基础
无论是什么命令,用于什么用途,在Linux中,命令有其通用的格式:
command [-options] [parameter]
command
:命令本身-options
:[可选,非必填]命令的一些选项,可以通过选项控制命令的行为细节parameter
:[可选,非必填]命令的参数,多数用于命令的指向目标等
语法中的[],表示可选的意思。
比如:ls -l /home/hello.txt
,ls是命令本身,-l是选项,/home/hello.txt是参数
Linux基本指令
Linux的指令非常多,我们也不可能全部都记住,假如我们忘了一些指令具体的作用是什么的话,可以查看手册。对于C/C++有一个官方文档,可以帮助我们查看一些函数接口的作用、功能等。而对于Linux也有文档可以查看,于是我们先学习第一个操作指令。
man指令
我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是man
语法: man [选项] 命令。
常用选项:
- k 根据关键字搜索联机帮助
- num 只在第num章节找
- -a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用a选项,当按下q退出,他会继续往后面搜索,直到所有章节都搜索完毕
操作方法如上图所示。
使用man时的操作键:
操作键 | 功能 |
---|---|
空格键 | 显示手册的下一屏 |
Enter键 | 一次滚动手册页的一行 |
b | 回滚一屏 |
f | 前滚一屏 |
q | 退出手册 |
/word | 搜索word字符串 |
解释一下,man手册分为8章
- 是普通的命令
- 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)
- 是库函数,如printf,fread4是特殊文件,也就是/dev下的各种设备文件
- 是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义
- 是给游戏留的,由各个游戏自己定义
- 是附件还有一些变量,比如向environ这种全局变量在这里就有说明
- 是系统管理用的命令,这些命令只能由root使用,如ifconfig
ls指令
单词全称:list
语法: ls [选项] [目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
常用选项:
参数 | 含义 |
---|---|
-a | 显示指定目录下所有子目录与文件,包括隐藏文件 |
-l | 以列表方式显示文件的详细信息 |
-h | 配合 -l 以人性化的方式显示文件大小,列出文件大小,如K/M/G |
-d | 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录 |
-k | 以 k 字节的形式表示文件的大小。ls –alk 指定文件 |
-r | 对目录反向排序 |
-R | 列出所有子目录下的文件。(递归) |
-1 | 一行只输出一个文件 |
注意:以 .
开头的文件为隐藏文件,需要用 -a 参数才能显示
示例:
语法中的选项是可以组合使用的,比如学习中的-a和-l
可以组合应用。
ls -l -a
ls -la
ls -al
上述三种写法,都是一样的,表示同时应用-l和-a的功能
cd指令
单词全称:change directory
语法:cd 目录名
功能:更改当前的工作目录。将当前工作目录改变到指定的目录下。
cd命令无需选项,只有参数,表示要切换到哪个目录下;cd命令直接执行,不写参数,表示回到用户的根目录下
命令 | 含义 |
---|---|
cd | 切换到当前用户的主目录(/home/用户目录) |
cd ~ | 切换到当前用户的主目录(/home/用户目录) |
cd . | 保持在当前目录不变 |
cd … | 返回到上级目录 |
cd - | 可以在最近两次工作目录之间来回切换 |
示例:
相对路径和绝对路径
相对路径:以当前目录为起点,描述路径的一种写法,路径无需以/
开头
绝对路径:以根目录为起点,描述路径的一种写法,路径以/
开头
pwd指令
单词全称:print work directory
语法: pwd
功能:查看当前所在的工作目录
示例:
我们先用cd /boot
进入到boot目录中,然后使用pwd指令来查看当前目录,显示结果就是/boot目录
如果你是root用户,使用pwd命令后显示的是/root
;而如果你是普通用户的话,显示的结果是/home/用户名
,这里的用户名是你创建普通用户的名字。
mkdir指令
单词全称:make directory
语法:mkdir \[选项] dirname
功能:在当前目录下创建一个名为 “dirname”的目录
常用选项:
- -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录
示例:
新建目录的名称 不能与当前目录中 已有的目录或文件 同名
touch指令
语法:touch 文件
功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。
cat指令
语法:cat [选项] [文件]
功能: 查看目标文件的内容
cat不适合看大文本,适合看小文本,至于为什么,可以接着往下看。
命令 | 含义 |
---|---|
-b | 对非空输出行编号 |
-n | 对输出的所以行编号 |
-s | 不输出多行空行 |
示例:
先把内容输入到文件当中
选项区别:
more指令
语法:more \[选项] \[文件]
功能:more支持翻页,如果文件内容过多,可以一页一页的展示
基本选项和man
指令一样,这里就不在过多展示了,直接看示例吧。
示例:
我们先用一个脚本指令写一个从1到10000行的hello Linux
到test.txt文件当中。
当我们使用cat
指令查看内容时,会直接显示到最后,而如果想看最开始的内容,则需要慢慢的往前翻,非常的不方便,所以上面说过cat指令不适合看大文件。
而如果想看前面的内容就可以使用more指令:
cp指令
单词全称:copy
语法:cp \[选项] 源文件或目录 目标文件或目录
功能:复制文件或目录
说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。
常用选项:
命令 | 含义 |
---|---|
-f或–force | 强行复制文件或者目录,不论目的文件或目录是否已经存在 |
-i或–interactive | 覆盖文件之前先询问用户 |
-r | 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理 |
-R或–recursive | 递归处理,将指定目录下的文件及子目录一并处理 |
mv指令
单词全称:move
语法:mv [选项] 源文件或目录 目标文件或目录
功能:
- 视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。
- 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
- 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中
rm指令
单词全称:remove
语法:rm [选项] 参数1 参数2
功能:删除文件或目录
常用选项:
选项 | 含义 |
---|---|
-f | 即文件属性为只读,亦直接删除 |
-i | 删除前逐一询问确认 |
-r | 删除目录及其下所有文件 |
普通用户删除内容不会弹出提示,只有root用户删除内容时会有提示,所以一般用户用不到-f选项。
参数1、参数2 表示要删除的文件或者文件夹路径,按照空格隔开。
- 示例:
rm命令支持通配符*
,用来做模糊匹配。符号*
表示通配符,即匹配任意内容(包含空),示例:
test*
,表示匹配任何以test开头的内容*test
,表示匹配任何以test结尾的内容*test*
,表示匹配任何包含test的内容
比如说你很多以.txt
结尾的文件,那么就可以用rm *.txt
来删除所有文件。
rmdir指令
rmdir是一个与mkdir相对应的命令。mkdir是建立目录,而rmdir是删除命令。
语法:rmdir \[-p] \[dirName]
适用对象:具有当前目录操作权限的所有使用者
功能:删除空目录
常用选项:-p :当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除
less指令
- less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。
- less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看
- 但若使用了 less 时,就可以使用 [pageup][pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!
- 除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜
语法:less [参数] 文件
功能:less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件。
常用选项:
选项 | 含义 |
---|---|
-i | 忽略搜索时的大小 |
-N | 显示每行的行号 |
/ | 向下搜索“字符串”的功能 |
? | 向下搜索“字符串”的功能 |
n | 重复前一个搜索(与/或?有关) |
N | 反向重复前一个搜索(与/或?有关) |
q | 退出 |
head指令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾
语法: head [参数]… [文件]…
功能:head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行
选项:-n<行数>
:显示指定的行数
- 示例:
tail指令
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail - f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容
语法: tail [必要参数] [选择参数] [文件]
功能: 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件
选项:
- f 循环读取
- -n<行数> 显示行数
- 示例
这个test.txt文件有3000行内容,比如说我们想看第1001行到1020行的内容,总共有2种方法可以看到。
方法1:head -1020 test.txt > temp.txt
,然后再tail -20 temp.txt
就是先把前1020行的内容重定向到temp.txt文件中,然后再从temp.txt文件中从尾部取20行。
方法2:head -1020 test.txt | tail -20
具体解释在后面的讲解中会学习,可以先认识一下。
which指令
我们在前面学习的Linux命令,其实它们的本体就是一个个的二进制可执行程序。和Windows系统中的.exe文件,是一个意思。我们可以通过which命令,查看所使用的一系列命令的程序文件存放在哪
语法:which 要查找到命令
- 示例:
find命令
- Linux下find命令在目录结构中搜索文件,并执行指定的操作。
- Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。
- 即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限
- 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。
语法:find 起始路径 -name “被查找文件名”
功能:用于在文件树种查找文件,并作出相应的处理(可能访问磁盘)
常用选项:
选项 | 含义 |
---|---|
find / -name test.txt | 查找当前目录下名为 txt.sh 的文件 |
find / -name “*.txt” | 查找当前目录下后缀为 ‘.txt’ 的文件 |
find /home/user1 -name *.txt | 在目录 ‘/ home/user1’ 中查找带有’.txt’ 结尾的文件 |
find /etc -type f | 查找 etc 目录下的所有文件 |
find /etc -type d | 查找 etc 目录下的所有文件夹 |
find /usr/bin -type f -atime +100 | 查找在过去100天内未被使用过的执行文件 |
find /usr/bin -type f -mtime -10 | 查找在10天内被创建或者修改过的文件 |
find /home -size 10M | 查找 home 目录下等于 10M 的文件 |
find /home -size +10M | 查找 home 目录下大于 10M 的文件 |
find / -mtime -3 | 查找 3 天内修改过的文件 |
find / -atime -3 | 查找 3 天内访问过的文件 |
注意:按文件大小查找文件的话,把-name
改成-size
,+和-表示大于和小于,而且数字后面要跟单位,如k(小写字母)表示kb、M表示MB、G表示GB。
- 示例
grep命令
语法:grep [选项] “关键字” 文件路径
功能:在文件中搜索字符串,将找到的行打印出来
常用选项:
选项 | 含义 |
---|---|
-i | 忽略大小写的不同,所有大小写视为相同 |
-n | 顺便输出行号 |
-v | 反向选择,亦即显示出没有“关键字”内容的那一行 |
-c | 输出文件中匹配“关键字”的数量 |
-o | 只输出匹配的内容“关键字” |
-w | 只匹配“关键字”这个字符串的行 |
- 示例:
先用touch指令创建一个文件,然后向这个文件输入三行内容,最后用grep指令查找相关内容。
管道符
在tail指令一节,我们知道了管道符这个符号。那么管道符的含义是:将管道左边命令的结果,作为右边命令的输入。其中|
叫做管道符。可以理解现实生活中的管子,管子的一头塞东西进去,另一头取出来,这里 | 的左右分为两端,左端塞东西(写),右端取东西(读)。
- 示例:
将cat test.txt
指令的结果作为右边grep hello
命令的输入。
echo命令
语法:echo 输出的内容
功能:显示输出的内容
无需选项,只有一个参数,表示要输出的内容,输出的内容默认是字符串形式并且会自动换行,要是复杂的内容可以用""
包围。
重定向符:>和>>
>
:将左侧命令的结果,覆盖写入到符号右侧指定的文件当中>>
:将左侧命令的结果,追加写入到符号右侧指定的文件当中- 示例:
重要的几个热键[Tab],[ctrl]-c, [ctrl]-d
- [Tab]按键—具有命令补全和档案补齐的功能
- [Ctrl]-c按键—让当前的程序停掉
- [Ctrl]-d按键—通常代表着:**键盘输入结束(End Of File, EOF 戒 End OfInput)**的意思;另外,他也可以用来取代exit
历史命令记录
在学习Linux中,我们需要使用很多的命令,有时候一条指令会很长,当下一次使用这个指令的时候,又要重新写一遍。所以Linux供了一些快捷键来帮助我们提高效率。就比如说"历史命令记录"可以让你快速找到以前使用的指令,直接使用。
- 使用快捷键方法
快捷键 | 描述 |
---|---|
↑(上方向键) | 查看上一条命令 |
↓(下方向键) | 查看下一条命令 |
ctrl+p | 查看历史命令记录中的上一条命令 |
ctrl+n | 查看历史命令记录中的下一条命令 |
ctrl +r | 进入反向搜索模式 |
Alt+> | 移动到历史命令记录末尾 |
- 使用history方法
使用history命令可以列出所有使用过的命令并为其编号。这些信息被存储在用户主目录的.bash_history
文件中,这个文件默认情况下可以存储1000条历史命令记录。
语法:history [选项]
- 示例:
history 5 #查看最近的5条历史命令记录
history -c #清空所有历史命令记录
- 使用历史命令方法
使用“!+编号”可以执行特定编号对应的历史命令,使用fc
命令可以编辑历史命令。
使用实例 | 功能描述 |
---|---|
!! | 重复执行上一条命令 |
!n | 执行历史命令记录中的第n条命令 |
!w | 执行上一条w命令(或执行以w开头的历史命令) |
fc | 编辑并执行上一条历史命令 |
fc -2 | 编辑并执行倒数第2条历史命令 |
!-n | 执行倒数第n条命令 |
!$ | 使用前一条命令最后的参数 |
find指令
语法:find 查找范围 [条件]
功能:查找相关的文件。
选项 | 含义 |
---|---|
-name “文件名” | 按名字查找(例如:find / -name “test.txt” (查找到是在当前目录下test.txt文件) |
-type 文件类型 | 按文件类型查找。例如:find /var -type d(在 /var 目录中查找所有目录) |
-size [+/-]大小 | 按大小查找(例如:find /home -size +10M(在 /home 目录中查找大于 10MB 的文件)) |
-mtime [+/-]天数 | 按修改时间查找(例如:find /application/log/ -mtime +0 -type d (查找/application/log下一天前的日志,类型为目录)) |
-atime [+/-]天数 | 按访问时间查找(例如:find /var/log -atime +30(在 /var/log 目录中查找超过30天未访问的文件)) |
-user 用户名 | 按用户查找(例如:find /home -user alice(在 /home 目录中查找所有属于用户 alice 的文件)) |
-perm 权限 | 按权限查找(例如:find /etc -perm 644(在 /etc 目录中查找权限为 644 的文件)) |
-group 组名 | 按用户组查找(例如:find /home -group developers(在 /home 目录中查找所有属于组 developers 的文件)) |
删除乱码文件
有些时候,我们会遇到文件名称是乱码的,我们想要按名字删除的话,还不好删。这时可以通过删除inode
的方法来处理。
示例:
- 使用
ls -i
命令找到文件的inode
号。 - 使用
find
命令根据inode
号删除文件。find . -inum 12345 -delete
。
这种方法适用于删除文件或者空目录。如果是非空目录,需要使用其他参数。