Linux 文件管理命令 mv、rm、which、tree 讲解| 学习笔记

简介: 快速学习 Linux 文件管理命令 mv、rm、which、tree 讲解

开发者学堂课程【Linux 企业运维实战 - 入门及常用命令Linux 文件管理命令mv、rm、which、tree 讲解】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/550/detail/7604


Linux 文件管理命令 mv、rm、which、tree 讲解


内容介绍:

一、移动和重命名文件

二、删除

三、目录 操作

四、练习

五、索引节点

六、目录


一、移动和重命名文件

mv[OPTION]...[-T] SOURCE DEST

mv [OPTION]... SOURCE...DIRECTORY

mv [OPTION]... -t DIRECTORY SOURCE...

常用选项:

-i:交互式  (会询问是否覆盖)

-f:强制

讲解:

mv也可以移动或者重命名文件夹,是move的简写,是一个别名,alias mv= ‘mv -i’也是一个外部命令,基本语法与cp类似,也是三种

要将root下的a文件移动到data目录下,现在data目录下,输入

mv /root/a .

Ls

显示data下出现a文件

image.png

如果当前已经在该目录中,但要放到同一目录下,输入

mv a b

ls

相当于将当前目录的a改名为b

image.png

cp 命令只是复制了一个副本,原来文件位置不变,但是mv文件直接移动,原文件位置不存在

mv 命令也可以操纵文件夹,当前 root 目录下有 Downloads 文件夹,要移动到data 目录下,输入

mv /root/Downloads/  /data/

ls

显示 data 下出现 Downloads 文件夹

mv 命令也可以对文件夹进行改名,比如将 Downloads 改为D,输入

mv Downloads/ D

ls

显示 data 目录下 Downloads 变为D

mv [OPTION]... -t DIRECTORY SOURCE...语法比较实用,可以把多个文件移动到某一个目录中

,写这种语法也可以用-t,比如将root中的某些文件移动到data目录下,输入

mv -t /data  /root/f1  /root/b

因为data目录下已经存在b,所以结果显示询问是否覆盖


二、删除

rm[OPTION]... FILE...

常用选项:

-i  交互式

-f  强制删除

-r  递归

--no-preserve-root 删除/

示例:

rm -rfl

讲解:

不需要某文件时,可以输入rm进行删除,比如输入

rm a.txt

结果会询问是否删除,输入y确认删除

也可以使用-f选项省略掉询问步骤,输入

rm -f b

这样直接会删除b文件

事实上,rm命令也是一个别名,alias rm= ‘rm -i’

若使用原始的\,也不会询问是否删除,输入

\rm b.txt

直接删除

注意普通用户例如 wang 用户时 rm 不是别名,在删除文件 hosts 时,输入

rm hosts直接删除

-r删除的不是文件,比如要把整个目录下的文件删除,输入

rm -r /data

显示如图,询问是否进入该目录,之后寻找到一个文件便询问是否要删除

可以用f强制删除所有,输入

rm -rf /data

结果删除了所有文件,但是删除不了 datat 本身这个目录,因为 data 是一个挂载点

此外使用rm -rf /删除不了根目录,但是如果想要清理数据,可以使用--no-preserve-root 进行删除,也可以输入rm -rf /*

为了避免误删除,可以将 rm 进行改名,也可以将rm定义成别名,输入rm=mv,当实行 rm 命令删除时,实际上是将文件放入一个临时目录下

例如想要执行rm anaconda-ks.cfg = mv  anaconda-ks.cfg  /data的效果,就意味着要将 rm 定义成别名

如果直接输入alias rm=mv,删除文件输入rm anaconda-ks.cfg时相当于实现一个别名的 mv,但是语法错误

mv 的语法是前面写源,后面写目的,如果先输入rm= “mv anaconda-ks.cfg  /data ”,那么在执行rm anaconda-ks.cfg就相当于执行mv anaconda-ks.cfg

所以定义别名时用到-t选项,输入

alias rm= ‘mv -t /data’

定义后删除该文件输入rm anaconda-ks.cfg实际上相当于mv -t /data anaconda-ks.cfg,即

rm anaconda-ks.cfg = mv -t /data anaconda-ks.cfg

所以输入rm anaconda-ks.cfg就会移走

再来输入

ls /data进行查看

结果显示 anaconda-ks.cfg

此外,删除的文件是在磁盘中不再占空间

输入 df 查看当前各分区,观察到boot目录

再输入df -h查看,boot剩下857M空间

现在在boot下创建一个大的新文件填满分区,输入

cd /boot

ls

dd if=/dev/zero of=bigfile bs=1M count=800

创建了一个800M的文件,再来查看boot空间,输入

df -h

观察到 boot 下数据占比由16%到95%,还剩下57M

现在要找到 boot 中占空间较大或者无用的文件进行移走或删除,以保证系统正常运行,当前 bigfile 为占空间大的文件

现在若将该文件删除,它所占有的空间是否可以马上释放呢?

输入

rm bigfile

不能删除,因为已经定义成别名,先来删除别名,输入

unalias rm

ls

ll bigfile

rm bigfile

删除后再来查看空间是否释放,输入

df -h 

结果显示空间确实释放

再输入

ls /data

rm -f /data/bigfile   //删除data下的该文件

alias    //再来确定刚才别名是否删除

确定已经删除,之后再来执行刚才dd命令,输入

!dd

df -h

空间又变成95%

若在删除前,有其他人正在访问该文件,我们输入

rm -f bigfile

ls

表面上删除了该文件,输入ls后查看没有该文件

但是输入df -h

查看空间并未释放,依然占据95%

但是当访问结束,打开操作关闭时我们再来输入 df -h会发现空间释放,删除之后不是立即释放空间

那么在这种情况下如何正确的删除一些文件,而不是传统的使用rm呢?

再将文件创建出,输入

!dd

再在另一个端口用vim程序操作临时打开

输入rm -f bigfile不会立即释放空间,这时有一个工具lsof

输入lsof |grep deleted

该命令会查看当前系统中是否有文件被删除但是还没有释放空间

image.png

观察到/boot/bigfile

再来输入df -h查看

显示结果/boot中空间占比仍为95%,但是再输入

ls

该文件确实在磁盘中看不见

此时在lsof命令下可以看到有一个程序vim在删除文件后还未释放空间

要想立即释放空间,需要结束进程vim,此处先用命令killall

输入killall vim

在另一个端口显示vim已经被中断

image.png

输入 lsof |grep deleted看不到该文件,再来输入df进行查看

df -h

显示结果已经释放空间

killall是杀掉程序的意思,不推荐,还有第二种方法,删掉该文件但是也不影响另一程序使用,还能释放空间

先创建文件,输入

!dd

df -h

查看空间又成为95%

再在另一个端口访问该文件

然后使用>的方法,>创建一个空文件,如果该文件已经存在会覆盖

输入

> bigfile

df -h

显示文件空间已经释放

但是输入ls,该文件还存在

再输入

ll bigfile

显示该文件大小已经为0

这时再来删除文件,输入

rm -f bigfile

再输入df -h查看

这样就可以安全的释放空间,删除文件,对于大文件来讲,推荐使用>方法,而不是传统的rm来删除

总结:删除大文件,释放磁盘空间

> bigfile

rm -f bigfile

 

三、目录操作

tree显示目录树

-d:只显示目录

-L level :指定显示的层级数目

-P pattern:只显示由指定pattern匹配到的路径

mkdir创建目录

-p:存在于不报错,且可自动创建所需的各目录

-v:显示详细信息

-m MODE:创建目录时直接指定权限

rmdir 删除空目录

-p:递归删除父空目录

-v:显示详细信息

rm -r递归删除目录树

讲解:

目录也是一个文件,只不过是特殊文件。其中工具 tree 可以显示目录结构(文件夹结构)比如现在想要显示一下 boot 目录下有哪些文件,它的分层结构是什么

先来安装 tree 工具,输入

rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm

装完后执行输入

tree /boot

image.png

显示的就为目录结构

此外目录结构 tree 还可以加一些特定选项,显示特定的层。默认情况下显示是有多少文件夹,有多少层全部显示。

比如想要显示第一层,第一层用L,但是L选项一般在最前面,所以输入

tree -L 1  /boot

显示结果如图

image.png

默认情况下也显示出文件,有三个文件夹,八个文件

如果只是想显示目录的结构,不想显示文件或文件夹,这时可以使用-d选项,输入

tree -L 1 -d  /boot

显示如图,就是纯目录结构

image.png

再来显示两层,输入

tree -L 2  -d  /boot

显示如图

image.png

mkdir 是创建空目录,之前的 touch 是创建空文件,而 mkdir 是创建文件夹,比如在 data 下定义一个文件夹 dir1

输入mkdir /data/dir1

再来查看它的目录结构,输入

tree /data

显示如图

image.png

其中 anaconda-ks.cfg 是一个文件,我们也可以只显示目录结构,再来输入

tree -d /data

那么可以创建很深的子目录吗?

例如输入mkdir /data/dir1/dir2/dir3/dir4

直接这样创建会提示不能这样创建,因为dir4想创建但是还没有dir3,dir3想创建但是还没有dir2,此时可以使用-p选项,如果发现子目录创建时父目录不存在会直接创建父目录

输入mkdir  -p /data/dir1/dir2/dir3/dir4

生成后再来查看,输入

tree /data

显示如图,将父目录一并创建

image.png

如果想要显示创建的过程,可以加上v选项

mkdir  -pv /data/dira/dirb/dirc/dird

再来输入 tree /data

image.png

在创建目录时顺便可以用-m选项指定权限

rmdir只能删除空文件夹,比如要删除data下的dird,输入

rmdir /data/dira/dirb/dirc/dird

tree /data

image.png

但是要想删除dira,输入rmdir /data/dira

结果会显示不能删除,因为dira里有子数据,不是空文件。当然要想删除,可以用到以前知识,输入rm -rf /data/dira就会删除

再来输入tree /data结果显示dira一串数据都会被删除

想要使用rmdir来删除dir1,使用到p选项。

rmdir默认删为空的dir4,p选项会删除空的dir4后再删除为空的dir3,再删除为空的dir2,直到删除dir1。是删完子文件夹再查看父目录是否为空,为空也删除

输入 rmdir -p  /data/dir1/dir2/dir3/dir4/

结果显示 rmdir:failed to remove directory ‘/data’:Device or resource busy

删到data目录时无法删除

再来输入tree /data来查看,显示dir1一串数据都被删除

rm可以代替rmdir功能


四、练习

(1) 如何创建/testdir/dir1/x,

/testdir/dir1/y,/testdir/dir1/x/a,/testdir/dir1/x/b,/testdir/dir1/y/a, /testdir/dir1/y/b

(2) 如何创建/testdir/dir2/x,

/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b

(3) 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6,/testdir/dir5/dir7

(1) 的目录结构实际上为testdir目录下有dir1,dir1下有x和y,x下有a和b,y下有a和b,x和y分别要和ab组合

/testdir/dir1

|----x

|--a

|--b

|----y

|--a

|--b

输入 mkdir -p /testdir/dir1/{x,y}/{a,b}    //{}/{}相当于x/a组合,x/b组合,y/a,y/b

再输入tree /testdir/dir1来查看

image.png

(2) 的目录结构实际上是dir2目录下有x和y,x下有a和b

输入 mkdir -p /testdir/dir2/{x/{a,b},y}    //最外侧{}为x和y分别与dir2组合,内侧{}为x与a、b组合

输入tree /testdir/dir2查看

image.png

(3) 的目录结构实际上是testdir下有dir3、dir4、dir5,dir5下有dir6和dir7

输入 mkdir  /testdir/dir{3,4,5/dir{6,7}} -p

tree /testdir

image.png

-p规则写法放在中间,例mkdir -p /testdir/dir{3,4,5/dir{6,7}}

 

五、索引节点

inode ( index node )表中包含文件系统所有文件列表

一个节点(索引节点)是在一个表项,包含有关文件的信息(元数据),包括:

文件类型,权限,UID,GID

链接数(指向这个文件名路径名称个数)

该文件的大小和不同的时间戳

指向磁盘上文件的数据块指针

有关文件的其他数据

讲解:

每一个文件它的元数据以及数据本身在磁盘上保存时是分离的。假设有一块硬盘分区,有一个文件file为1G,有元数据也有数据内容,在磁盘上有一块空间是放元数据,有另一块空间放数据内容。

对于file文件,meta data放在元数据空间的一部分空间,有file的属性,例如time mode ownship等,相对来讲,在磁盘上占空间不大。1个G的数据放在数据内容空间的一部分空间,两部分空间在磁盘上是分离的,所以存在一个指针,当用户访问文件时,先看元数据,通过元数据有一个指针指向真正存放数据的空间,从而找到数据内容本身。

每个文件的元数据中还存在每个文件唯一的编号inode即节点编号。每个文件都有不同的节点编号

查看每个目录下的节点编号可以用-i

比如现在先进入文件中,输入

cd /data

ls

touch f1

ls -i

结果显示 67 anaconda-ks.cfg  68 f1

67和68就是anaconda-ks.cfg和f1两个文件的编号

在Linux中,每个文件的节点编号都存在范围问题,节点编号的唯一性是在一个分区中唯一,每个分区有自己的节点编号范围,当在一个分区中创建新文件时,系统会自动分配在这个分区中唯一的节点编号。

输入df -h

image.png

可见现在data是一个独立分区,boot也是一个独立分区。

再输入 ls /boot -i结果可见boot下也有编号为67、68的文件

虽然节点编号相同,但是在不同的分区中,仍然是不同的文件。

比如现在有第二个文件file2为2G,它在磁盘空间上也分离,元数据inode、time、mode等放在一个空间,也是通过一个指针指向数据内容的空间。其中存放元数据的空间叫做节点表inode table

image.png

inode表结构

image.png

指针大体分为两种指针,一种是直接指针,一种是间接指针。直接指针是直接指向文件存放的路径,间接指针当文件过大时可以使用。

另外,对于每个分区,节点编号是否是有限制的呢?

事实上节点编号是有最大值的

输入 df -i可以看到每个分区节点编号都有最大值

image.png

例如 boot 下节点编号最大为524288,每建一个文件都要用一个节点编号,意味着在 boot 下最多可以建524288个文件。

所以有时候在建文件时发现提示空间已满但是实际上空间未满,是因为节点编号用完

例如以 boot 为例,输入 df -h 显示现在 boot 空间还有857M,但是输入 df -i 显示节点数为524288,现在在 boot 下建立一个测试文件夹,再在测试文件夹中创建524288个文件,输入

mkdir /boot/testdir

cd /boot/testdir

touch file{1..524288}

结果显示-bash: /usr/bin/touch:Argument list too long

因为用 touch 命令相当于执行touch file1 file2 文件参数太多,所以不支持。

另外删除文件时若rm -rf /data/*也会提示参数太多,因为文件太多而不能删

用另种方法输入

echo file{1..524288} |xargs touch

该命令可以解决参数过多的问题

可以输入ls /boot/testdir/ 查看一下创建的过程,结果其中显示no space没有空间,但其实是节点编号用完的问题

输入df -h显示boot下还有足够的582M空间。虽然创建的是空文件,但是还是占了空间原因是文件的元数据占据空间。

再输入df -i查看节点编号完全消耗100%

那么文件过多可以使用ls file*显示吗?

显示结果为参数过多,不能显示

那么删除文件呢?rm -f file*

结果一样,但是如果想要删除可以使用以下方法

echo file{1..524288} |xargs rm

这是对付参数过多的应用方法。


六、目录

文件引用一个是 inode 号

人是通过文件名来引用一个文件

一个目录是目录下的文件名和文件inode号之间的映射

注意如果是一个文件夹,那么它的结构与一般文件不同。对于文件来说,刚才提到存在一个 file1 为1M,磁盘空间有两个分区,一部分放元数据,另一部分放1M的数据内容,指针由第一部分指向第二部分。

但是如果现在有一个目录dir1,目录下有f1和f2两个文件,dir1元数据放在元数据空间,而数据内容空间放f1 f2两个文件,设节点编号分别为10000、10002,那么在元数据空间中必然有f1的元数据

image.png

实际上要想访问f1,得访问dir1,通过dir1元数据指针指向的数据内容找到f1节点编号为10000,再返回在元数据空间中根据节点编号找到f1,然后再指向f1数据存放的内容

所以要想访问f1和f2,首先要有权限访问dir1.即要想访问一个目录中的文件,先要拥有访问文件夹的权限。

inode表

image.png

目录项中有a和b两个文件,inode table 中对应a和b的节点编号,然后节点编号对应磁盘中存放的数据内容,默认有一个指针指向。

如果删除了dir1中的f1文件,那么f1元数据所占的空间被删除,但是它在磁盘上所占的数据内容并未立即删除,只是被标记。也可以再给f1一个节点编号会恢复数据。

想要彻底删除数据,用到shred命令。

输入

mv anaconda-ks.cfg /root/

ls

显示f1

cp /etc/hosts .

ls

显示f1 hosts

例如现在想要删除hosts文件

输入ll hosts 查看文件大小,结果显示该文件为158

输入 shred hosts,该命令可以增加一些选项比如z,代表最后删除数据使用零覆盖

输入 shred -zv -n 6 hosts   //v显示处理过程,还可以指定覆盖多少次

image.png

如果再加上u,最后该文件夹也会删除

image.png

相关文章
|
3天前
|
安全 网络协议 Linux
linux必学的60个命令
Linux是一个功能强大的操作系统,提供了许多常用的命令行工具,用于管理文件、目录、进程、网络和系统配置等。以下是Linux必学的60个命令的概览,但请注意,这里可能无法列出所有命令的完整语法和选项,仅作为参考
|
3天前
|
监控 Linux 数据处理
|
3天前
|
编解码 Ubuntu Linux
|
3天前
|
JSON Linux 数据格式
Linux命令发送http
请注意,`curl`命令非常灵活,可以根据您的需求进行多种配置和自定义。您可以查看 `curl`命令的文档以获取更多详细信息。
10 0
|
5天前
|
安全 Linux 测试技术
|
5天前
|
安全 Linux Windows
Linux中Shutdown命令使用介绍
Linux中Shutdown命令使用介绍
10 2
|
6天前
|
缓存 关系型数据库 Linux
Linux目录结构:深入理解与命令创建指南
Linux目录结构:深入理解与命令创建指南
|
6天前
|
数据挖掘 Linux vr&ar
Linux命令实战:解决日常问题的利器
Linux命令实战:解决日常问题的利器
|
6天前
|
NoSQL Linux Redis
Redis的介绍,以及Redis的安装(本机windows版,虚拟机Linux版)和Redis常用命令的介绍
Redis的介绍,以及Redis的安装(本机windows版,虚拟机Linux版)和Redis常用命令的介绍
21 0
|
6天前
|
安全 Linux Shell
linux基础命令详解
linux基础命令详解
12 0