开发者学堂课程【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文件
如果当前已经在该目录中,但要放到同一目录下,输入
mv a b
ls
相当于将当前目录的a改名为b
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
该命令会查看当前系统中是否有文件被删除但是还没有释放空间
观察到/boot/bigfile
再来输入df -h查看
显示结果/boot中空间占比仍为95%,但是再输入
ls
该文件确实在磁盘中看不见
此时在lsof命令下可以看到有一个程序vim在删除文件后还未释放空间
要想立即释放空间,需要结束进程vim,此处先用命令killall
输入killall vim
在另一个端口显示vim已经被中断
输入 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
显示的就为目录结构
此外目录结构 tree 还可以加一些特定选项,显示特定的层。默认情况下显示是有多少文件夹,有多少层全部显示。
比如想要显示第一层,第一层用L,但是L选项一般在最前面,所以输入
tree -L 1 /boot
显示结果如图
默认情况下也显示出文件,有三个文件夹,八个文件
如果只是想显示目录的结构,不想显示文件或文件夹,这时可以使用-d选项,输入
tree -L 1 -d /boot
显示如图,就是纯目录结构
再来显示两层,输入
tree -L 2 -d /boot
显示如图
mkdir 是创建空目录,之前的 touch 是创建空文件,而 mkdir 是创建文件夹,比如在 data 下定义一个文件夹 dir1
输入mkdir /data/dir1
再来查看它的目录结构,输入
tree /data
显示如图
其中 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
显示如图,将父目录一并创建
如果想要显示创建的过程,可以加上v选项
mkdir -pv /data/dira/dirb/dirc/dird
再来输入 tree /data
在创建目录时顺便可以用-m选项指定权限
rmdir只能删除空文件夹,比如要删除data下的dird,输入
rmdir /data/dira/dirb/dirc/dird
tree /data
但是要想删除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
来查看
(2) 的目录结构实际上是dir2目录下有x和y,x下有a和b
输入 mkdir -p /testdir/dir2/{x/{a,b},y}
//最外侧{}为x和y分别与dir2组合,内侧{}为x与a、b组合
输入tree /testdir/dir2
查看
(3) 的目录结构实际上是testdir下有dir3、dir4、dir5,dir5下有dir6和dir7
输入 mkdir /testdir/dir{3,4,5/dir{6,7}} -p
tree /testdir
-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
可见现在data是一个独立分区,boot也是一个独立分区。
再输入 ls /boot -i结果可见boot下也有编号为67、68的文件
虽然节点编号相同,但是在不同的分区中,仍然是不同的文件。
比如现在有第二个文件file2为2G,它在磁盘空间上也分离,元数据inode、time、mode等放在一个空间,也是通过一个指针指向数据内容的空间。其中存放元数据的空间叫做节点表inode table
inode表结构
指针大体分为两种指针,一种是直接指针,一种是间接指针。直接指针是直接指向文件存放的路径,间接指针当文件过大时可以使用。
另外,对于每个分区,节点编号是否是有限制的呢?
事实上节点编号是有最大值的
输入 df -i可以看到每个分区节点编号都有最大值
例如 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的元数据
实际上要想访问f1,得访问dir1,通过dir1元数据指针指向的数据内容找到f1节点编号为10000,再返回在元数据空间中根据节点编号找到f1,然后再指向f1数据存放的内容
所以要想访问f1和f2,首先要有权限访问dir1.即要想访问一个目录中的文件,先要拥有访问文件夹的权限。
inode表
目录项中有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显示处理过程,还可以指定覆盖多少次
如果再加上u,最后该文件夹也会删除