从本篇文章开始,我将总结一些Java工程师日常研发工作中会使用到的Linux命令,在介绍这些命令的过程中,也会对Linux系统的一些基础知识进行普及。希望对大家工作和学习有所帮助吧。
本篇将从文件与目录管理开始,毕竟Linux中一切皆文件嘛。
注:本系列文章所有操作都是基于RedHat系列的Centos 7。所以开始学习前,请大家先安装Centos 7。
1. 基本概念
那么,先来看看几个基本概念吧
1.1 Linux的目录结构
Linux的目录结构可以看作一颗树,起点是根,也称为根目录,每一个目录可以看作是枝,每一个文件节点可以看作是叶。如下图:
举几个小例子:
根: /
枝:/usr
叶:/usr/local/data.db
1.2 家目录
在Linux中,系统在创建每一个用户时,都会为这个用户创建一个家目录,类似于Windows中的“我的文档”。这些用户分两类,一类是超级管理员,一个系统只能有一个超级管理员,它的用户名是root,它的家目录是/root。另一类是普通用户,它的家目录是/home/$用户名,比如一个用户名为jacky的用户,它的家目录是/home/jacky。
当用户登录系统时,默认进入的目录就是该用户的家目录。
1.3 绝对路径和相对路径
(1)绝对路径
从根目录开始查找的路径。比如说有一个文件data.db,它位于根目录的子目录usr下,那么它的绝对路径就是/usr/data.db。
注意:根目录一定是以/开头的,即从根开始一级一级向下找,一直找到这个目录为止。
(2)相对路径
从当前所在目录开始查找的路径。比如当前目录是usr目录,查找usr下的local子目录下的work文件,这个文件的相对路径就是local/work。
1.4 Linux系统自带目录及作用
Centos 6系列根目录下默认一级目录有:
- /bin 命令保存目录,普通用户可使用的命令
- /boot 启动目录,存放启动相关文件
- /dev 设备文件
- /etc 配置文件
- /home 普通用户的家目录
- /lib 第三方库文件保存目录,系统或软件运行所需依赖的第三方库文件
- /mnt 系统挂载目录
- /media 媒体外设挂载目录
- /misc 音频设备挂载目录
- /root 超级用户的家目录
- /tmp 临时目录 存放临时文件
- /sbin 超级用户才能使用的命令存放的目录
- /proc 内存运行目录,存放一些运行于内存中的信息
- /sys 系统配置内存目录
- /usr 用户共享资源目录,一般存放安装的第三方软件
- /var 可变文档目录,可用于存放访问日志等可变文档
注意:proc和sys的数据是直接写到内存中的,所以不能直接往这两个目录写数据,因为会写到内存,内存占满,系统就会崩溃。
Centos7 根目录下的一级目录出现了以下变动:
/bin, /sbin, /lib, /lib64都变成了链接文件,实际内存分别存放在/usr/bin, /usr/sbin, /usr/lib, /usr/lib64。
新增了/run目录存放系统服务进程生成的比如pid等临时文件,比如systemd生成的临时文件
1.5 文件类型
Linux不依靠后缀名来区分文件类型,总共有7种类型:普通文件、目录文件、软链接文件、块设备文件、字符设备文件、套接字文件和管道文件。常用的是前三种。
1.6 文件存储方式
Linux中一切皆文件,那么文件在磁盘上是如何进行存储的呢?文件的存储是由文件系统管理的,现主流的文件系统有EXT2/3/4,FAT16/32等。以EXT系列文件系统为例:
文件由两部分数据组成,一部分是文件的内容,称为数据块。一部分是文件的元信息,包括文件的权限、所有者、群组、时间参数等。
数据块是分块存储的,每一块都是物理上等大的数据,默认每个数据块4KB,是存储文件的最小空间,称为block。每一个block都有唯一的编号,当一个文件大到一个block无法存储时,就会将文件内容切分存储到不同的块中;
元信息则存储在inode中,每一个inode也有唯一的编号的,但与数据块不同,一个文件只会有一个inode。因此inode也经常用来作为文件的标识。
文件系统维护一个目录表,称为super block,它记录了一个文件的inode及它分配的block的编号。用于检索和管理文件存储。
2. 目录管理
2.1 查看当前路径
pwd
前面我们说过了用户登录系统后,默认进入的是家目录,那么我们以root用户登录后,输入以上命令,查看一下root用户的家目录:
pwd是三个英文单词的缩写:print working directory,打印(当前)工作目录。
2.2 查看目录子节点列表
2.2.1 当前目录下的子节点列表
使用以下命令:
ls [选项] [目录路径]
ls后不加选项,表示查看当前所在目录。
在根目录下执行ls命令,如下图:
2.2.2 指定目录下的子节点列表
在ls命令后加上要查看的目录路径
ls 目录路径
2.2.3 显示所有文件,包括隐藏文件
加上-a 选项,表示显示所有文件
ls -a 目录路径
2.2.4 显示文件详细信息
加上-l 选项,表示显示文件详细信息
ls -l 目录路径
这里显示的有文件的权限、所有者、所属组、文件大小、时间参数、文件名等。
2.2.5 人性化显示文件大小
加上-h 选项,表示人性化显示文件大小,可以结合-l选项。
ls -lh 目录路径
注意到,文件大小显示的是1.3K,而不再是之前例子中显示的1230了。
2.2.6 显示inode
加上-i选项,可以显示文件的inode。这是文件的唯一标识。
这里的8409154就是文件的inode。
2.2.7 显示目录属性
如果想要查看的是目录的属性,而不是目录下的子节点。则可以使用-d选项。
ls -d 目录路径
2.3 切换目录/进入目录
想要进入某个目录,执行以下命令
cd 目录路径
进入/usr/local目录,如下图所示:
此外,cd命令进行一些特定的目录,还有以下简化的命令
cd ~ 表示进入当前用户的家目录
cd - 进入上次目录
cd .. 进入上一级目录
cd . 进入当前目录
2.4 创建目录
2.4.1 创建单级目录
可以使用mkdir命令来创建目录
mkdir 目录名
比如,在/usr/local目录下创建一个新目录test。
创建完后,可以使用ls命令查看。
2.4.2 递归创建多级目录
mkdir加上-p选项,即可以递归创建多级目录。
mkdir -p test/today/job
2.5 删除目录
rmdir命令,用于删除空目录。如果目录里有子目录或者文件,则无法使用此命令。
rmdir job
3. 文件管理
3.1 创建文件
3.1.1 touch命令创建文件
touch命令可以在当前目录下创建一个空文件。
touch 文件名
3.1.2 输出重定向创建文件
输出重定向,我们在后面的系统管理部分文章再细讲。这里只讲以下命令格式
echo “文本内容” > 文件名
将文本内容输出重定向到文件,如果这个文件不存在,则会先创建这个文件。
3.1.3 vi工具创建文件
vi是linux自带的文本编辑工具,后面的文章我们会介绍它的用法。这里只涉及用它来创建文件的基本操作。
vi 文件名
以上命令会进行vi会话,如果这个文件不存在,则会先创建这个文件。用户可以输入:ESC键 + :wq退出。
3.2 查看文件内容
3.2.1 cat命令
cat命令用于将文件内容输出到标准输入设备(也就是屏幕)上。当文件内容很多时,会一闪而过,体验不是很好。
cat [选项] 文件名
常用选项有:
-n或--number:有1开始对所有输出的行数编号;
-b或--number-nonblank:和-n相似,只不过对于空白行不编号;
-s或--squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行;
3.2.2 less和more命令
more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。
more +3 test.log #从第三行开始显示日志内容
在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。而且** less 在查看之前不会加载整个文件, 它有缓冲区的概念**。
当查看文件内容较多时,建议使用less命令。
less file1
3.2.3 head和tail命令
head、tail #查看文本中开头或结尾部分的内容
head -n 5 a.log #查看a.log文件的前5行
tail -F b.log #循环读取(follow)
除了上述命令之外,vi也可以用来查看文件内容,等我们后面介绍vi时再细讲。
3.3 删除文件/目录
命令格式:
rm -rf [文件或目录]
选项
-r 删除目录
-f 强制
删除目录时,建议使用相对路径,避免误操作删除根目录下的所有内容(rm -rf /)
3.4 复制文件/目录
命令格式:
cp [选项] [原文件或目录] [文件或目录]
选项有:
-r 复制目录
-p 连带复制文件属性(比如时间参数)
-d 若源文件是链接文件,则复制链接属性
-a 相当于 -pdr
注意:如果不加 -p 选项,则复制出来的文件是新生成的,它拥有自己的文件属性,比如创建时间会是重新生成的。加上 -p选项之后,则连文件属性也一并复制过来了,就连创建时间也会和源文件相同。
3.5 移动(重命令)文件/目录
命令格式:
mv [原文件或目录] [目标目录]
例如
mv a.txt local/ 将文件b.txt移动到local目录下
mv /oracle/ test/ 将/oracle/目录移动到test目录下
注意:
- 如果原文件就在目标目录下,那就是改名命令。
- 与cp不同,mv命令移动目录时,不用加-r选项。
4. 管理链接
4.1 硬链接与软链接
链接分为硬链接和软链接。
前面我们已经提过,一个文件可以看作由两部分组成,一部分是元信息和索引信息,称为inode,一部分是实际文件内容,存储在一个或多个block块中。
硬链接可以看作对文件的一个引用,具有以下特点:
- 它与原文件拥有相同inode和block,可以看做是同一个文件
- 可通过inode进行标识
- 不能跨磁盘分区
- 不能针对目录进行使用
最重要的一点是:硬链接与原文件拥有相同的inode,所以它们的block块也是相同的,修改两者中任一个,文件的内容都会改变。无论删除硬链接和原文件任一个,只要另一个文件存在,都不影响对文件的访问(相当于只删除了对文件的一个引用而已,文件并没有被实际删除)。
创建了硬链接,文件的引用计数会加1。
软链接特征:
- 它拥有自己的inode和block块,但是block块中只保存原文件的文件名和inode编号,并没有实际的文件数据。
- 修改原文件或软链接二者任一,另一个都会改变。
- 删除原文件,软链接则不能使用。
注意:创建软链接,一定要写绝对路径,否则它会在目标目录下寻找原文件(不一定能找到)
4.2 创建链接
命令格式:
ln [选项] [原文件] [目标文件]
选项:
-s 创建软链接
不加选项,则创建的是硬链接。
5. 总结
本文讲述了Linux(具体是Centos 7)中常用到的文件和目录管理相关命令,这些命令在实际开发和运维过程中都是最基本的,必须熟记和多加练习。