在了解命令之前,我们得先来了解一下 Linux 的文件系统。
文件系统层次结构
在 Linux 系统之中,最小数据存储单位为文件。“一切都是文件”是 Linux 和 UNIX 一直贯彻的原则。也就是说,在 Linux 系统中,所有的数据都是以文件的形式存在的,包括设备。为了便于访问文件,Linux 按照一定的层次结构来组织文件系统。
树形层次结构
在 Windows 系统中,存储空间首先被分为不同的硬盘,然后在各个硬盘上再划分为分区。在每一个分区上面创建文件系统,在文件系统中创建不同的目录,在目录下再创建一个或多个子目录。尽管 Windows 的文件组织也是树形的层次结构,但是这个树形结构的根却不是唯一的,基本每一个分区都是一个想对独立的树形结构,且树与树之间并没有什么必然的联系。
但在 Linux 系统中,所有的存储空间与设备共享一个根目录,不同的磁盘块、不同的分区再挂接上来成为某个子目录的子目录,甚至设备也挂接成某个目录下的一个文件
在创建 Linux 文件系统的时候,至少要有一个根文件系统,作为整棵树的根节点,然后用户可以根据自己的需要创建其他的文件系统。
目录 | 说明 |
/bin | 二进制文件目录,用于存储系统管理员和普通用户使用的命令 |
/sbin | 该目录包含系统管理有关的可执行文件,普通用户不可使用 |
/boot | 操作系统启动时所需要的引导程序所在处 |
/dev | 设备文件存储位置。比如一些设备(光驱,磁盘,打印机等等)都会以目录的形式挂载到dev目录下 |
/etc | 系统的配置文件及其子目录的所在处 |
/home | 用户的主目录所在处。当系统管理员在创建用户的时候,会在此处自动创建用户的主目录 |
/root | root 用户的主目录 |
/lib 和 lib 64 | 系统使用的函数库所在处。前者为32位,后者为64位。 |
/lost+found | 每个文件系统都会包含一个该目录,用来存放 fsck 命令与检测和修复文件系统时删除的目录或者文件。 |
/media | 该目录为移动介质的挂载点。例如当用户插入U盘或移动硬盘,系统会自动将该设备挂载到该目录下面的一个子目录中。 |
/mnt |
文件系统的临时挂载点。用户可以临时将其他文件系统挂载到该目录下使用 |
/tmp | 存储临时文件的目录 |
/usr | 主要用于存放应用程序和文件 |
/var | 可以作为根目录的子目录,也可以单独作为一个文件系统。用来存储各种可变的数据文件,如日志文件。 |
在 Linux 系统中,分区和目录的关系如下:
- 任何分区都必须挂咋子到目录树中的某一个具体的目录上才能进行读写操作。
- 目录是逻辑上的区分,分区是物理上的区分。
- 根目录是所有 Linux 的文件和目录所在的地方,需要挂载上一个磁盘分区。
列出文件
在windows中,我们使用 dir 命令就可以列出当前文件夹中的文件与及目录,或者是 dir + 文件夹名,就可以列出指定文件夹中的文件。那在linux中呢,linux 为我们提供了强大的 ls 命令,来显示文件列表。其基本用法:
- 显示非隐藏文件和目录:直接使用默认选项,后不接参数
- 列出文件和子目录的详细信息: ls -l 也可以简写为 ll(两个小写的L)
- 显示 i 节点:i节点是一个整数值,如果两个文件的这个整数值一致的话,就代表这俩为同一个文件。ls的-i选项就可以将这个属性显示出来
- 以可读的方式显示文件大小:通过前面几种方式显示,我们会发现它显示文件大小大小的时候不是特别明了(以字节为单位),不利于初学者的阅读。linux提供了ls 的-h选项,与之搭配,文件的大小就相当明了。
- 显示隐藏文件:隐藏文件或者目录是通过在文件或者目录名前假一个圆点(.)表示的。而隐藏的文件只能在含有 -a 的 ls 命令中显示出来。
- 递归显示目录中的文件:所谓递归,就是不仅显示该目录文件,还显示子目录下的文件。 ls 的 -R 选项就提供了这个功能
文件类型
文件是数据在磁盘上存储的形式。我们在 Windows 上知道,文件类型有很多种,例如 word 文档、文本文件、可执行文件等等,而且我们可以通过文件名后的后缀名来判断该文件是什么类型。但在 Linux 系统中,我们不能根据后缀名来判断该文件是什么类型的,一般我们在新建文件的时候,保持文件后缀名,只是是我们便于直接区分辨认。
我们可以通过含有‘-l’选项的‘ls’命令(可以简为‘ll’)来查看文件类型。(或者 file 命令接文件名)
由上图可知,我们可以知道在 /etc 文件夹下有很多文件(在这里我省略很许多文件)。我们对上一个命令显示的几列说明一下:
第一列:第一个字母代表着文件的类型:-表示普通文件,d代表文件夹,l代表链接文件,c代表字符设备文件,s代表套接字文件,p代表管道文件
第2~10个字母中的前三个代表着所有者的权限,中间三个代表着所有者的用户组的权限,后三个代表其他用户的权限。
第二列:文件的硬链接数。
第三列:所有者即创建者用户。
第四列:所有者所在的用户组。
第五列:文件大小
第六、七、八列:分别对应着属性最后修改时的月份,日期,时间。
第九列:文件名。
文件权限
我们知道 Linux 是一个多用户的系统,所以每个用户都会创建自己的文件,为了保护文件被其他用户所篡改动,Linux 提供了一套完善的文件保护机制——文件的访问权限。
我们在上面可以看出,一个文件的基本权限分为三个权限组,分别为创建者、文件所属组与其他用户,分别用 u(user)、g(group) 和 o(other)代表。每个文件都有三种基本权限类型:读、写和执行,分别用 r(read)、w(write)和 x(execute)。
- 读权限,是指用户能够读取文件的内容。
- 写权限,是指用户能够写入或者修改文件或者目录内容
- 执行权限,是指用户能够执行该文件或者进入该目录。
例如上图的 adjtime 文件,我们可以看出,该文件是一个普通文件,是由 root 用户创建的,归 root 用户组。对于该文件,root 用户拥有读写权限,用户组拥有读权限,其他用户只有读的权限。除了用字母表示,Linux 还支持一种二进制数字表示。及分别用001、010和100分别代表执行权限、写权限和读权限转换十进制就是1、2、4。故 adjtime 文件的权限用二进制表示为110、100、100,转成十进制为6、4、4。
命令帮助:
man 指令:man+指令名称
help指令:指令名称+ --h 或者是:指令名称+ --help
sudo 命令
sudo命令是使其他普通用户以root用户的身份来执行某个命令
在这里,我们可以看出这个file文件的权限为r rw- --- --- 即,只有root用户才具有读和写的权限。因此,当hyxy这个用户想去读取这个文件的内容时,系统会提示权限不够。但我们用sudo命令后是可以读取的。
在 centos 系统,默认是不会给普通用户赋予 sudo 命令执行的权限,ubuntu系统默认会给创建系统是注册的普通用户提供 sudo 执行命令的。其他的是需要我们在配置文件中修改的。
我们只需在 /etc/sudoers 这个文件中添加 用户名 ALL=(ALL) ALL
此文件需要root用户权限进行读取,由于root用户没有该文件写的权限,,故修改后会提示无法保存,这时候,我们可以通过vim编辑器进行编辑,并加以强行保存;或者在打开前,我们修改其权限。
修改文件权限 - chmod
既然文件有权限,但是当我们使用的时候,我们会觉得有些权限对某一特定的用户(组)是(不)需要,所以我们得(添加)删除特定的权限。在 linux 里面,系统提供了 chmod 命令,用来修改文件权限。先看一下官方给出的用法
用法一: chmod [选项]... 模式[,模式]... 文件...
chmod u+x file1 赋予创建者file1文件的可执行权限
chmod g-w file2 删除用户组的file2文件的写权限
chmod o+w-r,g+x file3 为其他用户增加写权限,删除读取权限,同时为所在组增加执行权限
用法二: 采用八进制的形式
# 我们知道每个用户都有三种权限即 r、w、x,在这里规定,如果具有该权限则为1,不具有则为0
# 例如r-x,只具有读和写权限,则它对应的二进制码为101,转为八进制就是5.
chmod 600 file1 将file1文件的权限修改为 rw- --- --- (第一组为创建者,第二组创建者所在组,第三组为其他用户组)
chmod 777 file2 将file2 文件的权限修改为 rwx rwx rwx
修改文件的所有者权限
通常来说,文件的所有者为该文件的创建者,并且所有者拥有该文件的所有权限。但当想将该文件的所有者更改,该怎么整呢。系统给我们提供了一个名称为 chown 的命令,用来更改文件爱你的所有者。
用法:chown [选项]... [所有者][:[组]] 文件...
或: chown [选项]... --reference=参考文件 文件... 具体参数参阅帮助
来看这个命令,我们知道这个file1文件的所有者为hyxy,按理说,hyxy用户将这个file1文件的所有者更改为xiaofeng,是可以执行的。但是在这里,系统提示我们:这是一个不允许的操作。这是因为,在linux中,要想修改文件的所有者,只能是root用户才能修改,其他用户不能修改,即使这个文件的所有者是你。
文件与目录
显示当前位置 :pwd命令
文件/目录创建
- 使用 touch 命令创建
touch命令主要功能本来不是用来创建文件的,而是用来改变时间戳的。所谓的时间戳就是包括了访问的时间与修改的时间。touch 命令修改时间戳的时候,当该文件不存在,则会创建该文件基本用法:
touch 文件名
- 使用重定向创建
我们知道,在每一个系统中,很多应用都会有指定的默认设置。在 linux 中,每个命令的默认输出的目标设备就是控制台。比如在上面的例子中,我们查看当前目录下所有的文件 ls 命令,它就在控制台打印输出。那当我们想改变输出默认的输出位置该怎么办呢,此时我们可以使用系统提供的重定向操作,也称 I/O 重定向。重定向分为输出重定向和输入重定向。
输出重定向的操作符分倆种:> 和 >> 。这两种的区别在于,当目标文件已经存在的时候,使用后者时输出的内容会将已存在的内容进行覆盖,而前者不会。
同样、使用 ls 命令,然后将要输出的结果重定向到一个文件中也可以,只需在后加上 "> filename"( < 使用由你决定)
- 使用 vi / vim 编辑器创建
vi 是一个 unix 命令,是 unix 操作系统和类 unxi 系统中最通用的全屏幕文本编辑器。在 linux 系统中,vi 编辑器 又叫 vim 编辑器,它是 vi 的增强版,与 vi 编辑器完全兼容。
vi 编辑器 支持两种模式:编辑模式与命令模式。编辑模式完成文本的编辑功能;命令模式完成对文件的操作命令。默认情况下,打开 vi 编辑器后自动进入命令模式。命令模式切换至编辑模式使用:a、A、i、I、o或O,编辑模式切换至命令模式使用 esc 键。
在控制台中键入命令:vi filename 或者vim filename 回车就会进入vi编辑器。其中常用的命令如下、
命令 | 描述 |
i(a) | 在当前字符前(后)添加文本 |
I(A) | 在行首(末)添加文本 |
o(O) | 在当前行后(前)插入一空行 |
X(x) | 删除光标前(后)的一个字符 |
D | 删除从当前光标所在位置到该行末尾的全部字符 |
dd | 删除光标所在行 |
ndd | 删除光标所在行即往后的 n-1 行 |
P(p) | 粘贴文本至当前光标所在位置的上(下)方 |
Ctrl+u(d) | 向文件首(尾)翻半屏 |
Ctrl+f(b) | 向文件首(尾)翻一屏 |
w | 在命令模式,执行存盘操作 |
q | 在命令模式,执行退出 vi 操作 |
! | 在命令模式,强制执行某操作(例如 !q,强制退出) |
显示文件内容
在上面的例子,我们使用了 cat 命令,其实除了 cat 命令,还有 more、less 等命令都可以显示文件的内容。
- more 命令:分屏显示
more 命令,它以全屏幕的方式按页显示文件的内容
使用语法:
more 命令主要选项有 -数字、-c、-s,-数字用来指定每屏要显示的行数;-c表示不滚动屏幕,直接刷新该屏幕;-s用来压缩空白行。显示后,用户可以按下列不同的方法进行操作:
按空格键:显示文本下一屏内容
按回车键:只显示文本下一行内容
按斜线(/):接着输入一个字符串,用来匹配查找
按 h 键:显示帮助屏
按 b 键:显示上一屏的内容
按 q 键:推出 more 命令
- less 命令:前后翻页分屏操作
相对与more命令,感觉more命令是非常强大的。但是当要查看的文件相对来说较大的时候,使用more命令就觉得不太好了,因为less命令在加载文件的时候,它并不会一开始就把整个大文件的内容全部加载到内存中,因而这个时候,less就显得更先进,性能更好了。
less在用法上与more方法非常相似,除此之外,用户还可以通过 PgUp 和 PgDn 等按键进行翻页操作,用 q 推出 less 命令。
- cat 命令:拼接文件内容
cat 命令的基本功能是用来拼接文本文件内容并将其输入到屏幕上。
基本语法:
其中最常用的选项有 -n、-b 以及 -s,-n 与 -b 是用来添加行号的,-s 是用来压缩空白行。
1:单独使用 cat 命令
单独使用 cat 命令的时候为显示某个文本文件的内容,此时不需要任何参数选项
2:通过管道实现分屏
当我们直接使用 cat 命令时,如果文件的内容过多的话,会导致文件在显示的时候,内容会一闪而过。而利用管道,将 cat 和 more(less)联合使用,达到分页显示的效果,更便于阅读
3:合并文件
如果在 cat 命令后添加多个文件名,此时 cat 命令就会将这些文件的内容依次拼接起来,并输出到屏幕上。我们也可以使用重定向的方式,使其保存在某一文件中。
- head 命令:查看文件的前几行内容
其中最常用的参数为 -n :表示要输出的行数。
- tail命令:查看文件的后几行的内容
其中其用法与head用法一致。
文件的操作
我们知道文件的几种基本操作有:粘贴、复制、重命名、删除等。同样在linux系统中也有着相关操作命令。
文件复制 cp
文件复制就是为现有的文件创建副本的操作。提起创建副本,这种方法有很多,就比如使用重定向的方式等。但在这,我们使用Linux 系统提供的 cp 命令。
选项 | 描述 |
-a | 当复制目录时使用,它保留所有的信息,包含文件链接、文件属性、并递归地复制目录 |
-r | 若给出的源文件是一个目录,则会递归地复制该目录下的所有子目录与及文件,且目标文件必须为目录名 |
-d | 复制时保留链接 |
-p | 保留文件的修改时间和存取权限 |
-i | 如果已经有相同的文件名的目标文件,则会提示是否覆盖 |
例如:将当前目录下的所有文件复制到根目录下的 tmp 文件夹中
文件移动 mv
基本用法:
常用选项:
-i:交互式操作,对已存在的文件目录时,系统会询问是否进行覆盖;
-f:禁用交互式,对已存在的文件时,默认进行覆盖
文件删除 rm
常用语法:
常用选项:
-f:强制删除文件,不做任何提示
-i:删除前询问
-r:递归删除目录中的文件以及子目录,不指定的话,不能删除目录
重命名文件
重命名文件直接可用移动的命令
将 file1 文件重命名为 file2
文件压缩与解压
文件压缩与解压,是文件操作中较为常用的方法。
语法格式: tar [主选项+辅助选项] 文件或者目录
-c | 新建文件 |
-r | 把要归档的文件追加到档案末尾 |
-t | 列出档案文件中已经归档的文件列表 |
-x | 从打包的档案文件中还原出文件 |
-u | 更新档案文件,用新建文件替换档案中的原始文件 |
-z | 调用gzip命令在文件打包的过程中压缩/解压文件 |
-Z | 调用compress命令过滤文件 |
-w | 在还原文件时,把所有文件的修改时间设定为现在时间 |
-j | 调用bzip2 命令在文件打包的过程中压缩/解压文件 |
-f | 选项后紧跟档案文件的存储设备,默认是磁盘,需要指定文件名,该选项之后不能再跟任何选项,其必须是tar命令中最后一个选项 |
-v | 指定在归档文件过程中,显示各个归档文件的名称 |
-p | 在文件归档过程中,保证文件属性不发生变化 |
文件查找
全功能搜索:find命令
用来在指定路径下查找指定的文件
语法格式: find path-name [options] [-print -exec ok 命令 {} \;]
path-name:find 命令查找的目录路径,例如,可以用 . 表示当前目录路径,
-options:主要控制搜索的方式-print 将搜索结果输出到标准输出
-exec 对搜索出符合的文件执行linux命令,不会询问用户
-ok 对搜索出符合的文件执行linux命令,会询问用户