欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux 基本shell命令和Linux rm -rf原理分析

程序员文章站 2022-05-11 17:58:43
...

还是老规矩,循序渐进,先来简单入门一下Linux

Linux中一切皆文件,所以我们应该知道的是Linux中只有一个根目录,然后分为下图几个目录,其中桌面在home 目录下,图(来源网上):

Linux 基本shell命令和Linux rm -rf原理分析

cd

> cd 目的地   --(..代表父目录,.代表当前目录)   

一开始打开的终端仿真器是默认在桌面目录下打开的,即$前面有个~号。
Linux 基本shell命令和Linux rm -rf原理分析

pwd

> pwd                --显示当前路径

ls

> ls                    --显示当前目录下的文件(夹)

Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析

-R

> 递归的作用           --配合使用

Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析

-i

> 询问信息      --配合使用

touch

创建空文件

mkdir

创建空目录

cp

> cp   源文件   目的文件        ----复制源文件

mv

> mv 源文件  目的文件    ---移动,源文件消失

rm/rmdir

rm 删除源文件 / rmdir 删除空目录

file

> file 源文件    ---查看文件类型

Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析

cat

cat 源文件 –查看文件内容
cat 源文件 -n 带行号(包括空行)显示
cat 源文件 -b 带行号显示(只包括文本)
cat 源文件 -T 不让制表符(用^I代替)出现

Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析

more/less

> more/less  源文件   --查看大文件,以页的方式查看

tail/head

> tail/head  源文件 -n    --查看大文件内容的尾部和头部n行

tree

一种展示目录的美观工具,sudo apt install tree可安装

Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析

rm -rf

rm -rf -i 源目录 (r是递归删除,f是强制删除,i是提示信息)

Linux 基本shell命令和Linux rm -rf原理分析

Linux 基本shell命令和Linux rm -rf原理分析

递归删除是不是很神奇,这倒是让我产生了浓厚的兴趣,遂进行了一番研究,以下内容参考自:Linux rm删除文件原理

*
Linux 基本shell命令和Linux rm -rf原理分析

*文件系统的链接
Linux 基本shell命令和Linux rm -rf原理分析
硬链接(无法给目录添加)
Linux 基本shell命令和Linux rm -rf原理分析
符号链接(可以给目录添加)
Linux 基本shell命令和Linux rm -rf原理分析

只能够在处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。
文件 或目录的inode编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象,要想查看文件或目录的inode编号,可以给ls命令加入-i参数

很多时候,我们都会发现,某个进程在对当前文件读写,但是我们依然能够rm, 是不是很奇怪?而windows下面,肯定会报错,”当前文件正在被使用“, 这就得从linux下面删除文件的原理说起了。
  
Linux 基本shell命令和Linux rm -rf原理分析
Linux 基本shell命令和Linux rm -rf原理分析

  
   Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。
  
   i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。
  
  当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。
  
   对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
  
  这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
  
  以上讲的i_nlink及i_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?
  
  前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,此时,并没有删除文件的实体即(block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了

备注:根据以上原理,实际情况会出现以下问题,web服务器磁盘空间不够了,删除了所有无用日志还是显示磁盘空间不足,但是用du -sh /*发现磁盘空间占用的远小于硬盘总大小,这就是因为只删除了一个i_nlink,而还有其他进程在使用着这些log文件,apache或者tomcat,重启再看就ok了。

补充:

df命令详细用法
a:显示全部的档案系统和各分割区的磁盘使用情形
i:显示i -nodes的使用量
k:大小用k来表示 (默认值)
t:显示某一个档案系统的所有分割区磁盘使用量
x:显示不是某一个档案系统的所有分割区磁盘使用量
T:显示每个分割区所属的档案系统名称
h:动态显示易读的格式
常用命令:df -hi

du:查询档案或目录的磁盘使用空间
a:显示全部目录和其次目录下的每个档案所占的磁盘空间
b:大小用bytes来表示 (默认值为k bytes)
c:最后再加上总计 (默认值)
s:只显示各档案大小的总合 (summarize)
x:只计算同属同一个档案系统的档案
L:计算所有的档案大小
常用命令:du -a

系统管理命令:
start:显示指定文件的相关信息,比ls命令显示的内容更多
who,w:显示在线登录用户
whoname :显示用户自己的身份
hostname:显示主机名称
uname:显示系统信息
top:显示当前耗费资源最多的进程
ps:显示瞬间进程状态
du:显示文件已使用磁盘空间的总量
free:显示当前内存和交换空间的使用情况
ifconfig:显示网络接口信息
ping:测试网络的连通性
man:命令帮助信息查询
Alias:设置命令别名

alias[别名]=[“指令名”]

Clear:清屏
Kill:杀死进程

Linux 基本shell命令和Linux rm -rf原理分析

dpkg和apt get的区别:
两者的区别是dpkg绕过apt包管理数据库对软件包进行操作,所以你用dpkg安装过的软件包用apt可以再安装一遍,系统不知道之前安装过了,将会覆盖之前dpkg的安装。

1、dpkg是用来安装.deb文件,但不会解决模块的依赖关系,且不会关心ubuntu的软件仓库内的软件,可以用于安装本地的deb文件。
2、apt会解决和安装模块的依赖问题,并会咨询软件仓库, 但不会安装本地的deb文件, apt是建立在dpkg之上的软件管理工具。

dpkg软件管理工具:(基于Debian)
dpkg –info “软件包名” –列出软件包解包后的包名称.
dpkg -l –列出当前系统中所有的包.可以和参数less一起使用在分屏查看.
dpkg -l |grep -i “软件包名” –查看系统中与”软件包名”相关联的包.
dpkg -s 查询已安装的包的详细信息.
dpkg -L 查询系统中已安装的软件包所安装的位置.
dpkg -S 查询系统中某个文件属于哪个软件包.
dpkg -I 查询deb包的详细信息,在一个软件包下载到本地之后看看用不用安装(看一下呗).
dpkg -i 手动安装软件包(这个命令并不能解决软件包之前的依赖性问题),如果在安装某一个软件包的时候遇到了软件依赖的问题,可以用apt-get -f install在解决信赖性这个问题.
dpkg -r 卸载软件包.不是完全的卸载,它的配置文件还存在.
dpkg -P 全部卸载(但是还是不能解决软件包的依赖性的问题)
dpkg -reconfigure 重新配置

apt高级包管理工具
软件源设置 /etc/apt/sources.list
更新软件源数据 apt-get update
更新已安装软件 apt-get upgrade
更新系统版本 apt-get dist-upgrade
通过安装包或卸载包来修复依赖错误 apt-get -f install
搜索软件源数据 apt-cache search foo
解压安装软件包 apt-get install foo
重新安装软件包 apt-get –reinstall install foo
删除软件包释放的内容 apt-get remove foo
卸载软件,同时清除该软件配置文件 apt-get –purge remove foo
删除不需要的包 apt-get autoclean
删除所有已下载的包 apt-get clean

在用命令apt-get install之前,是先将软件包下载到/var/cache/apt/archives中,之后再进行安装的.所以我们可以用apt-get clean清除/var/cache/apt/archives目录中的软件包.
源码包安装

自动安装编译一软件所需要的包 apt-get build-dep foo

再次梳理一下:
文件目录操作指令:
ls:显示文件和目录列表
mv:移动文件或目录,文件或重名
-l:列出文件的详细信息
- find:查找指定的文件
-a:列出当前目录的所有文件,包含隐藏文件
-name:文件名
mkdir:创建目录
wc:统计文本文档的行,字,字数
-p:父目录不存在的情况下先生成父目录
grep:查找指定字符
cd:切换目录
rmdir:删除空目录
touch:生成一个空文件
tree:显示目录,目录改名为树
echo:生成一个带内容的文件
pwd:显示当前的工作目录
cat,tac:显示文本文件的内容
ln:建立链接文件
cp:复制文件或目录
more,less:分页显示文本文件内容
rm:删除文件
Head,tail:显示文件开头和结尾内容
-r:同时删除该目录下的所有文件
-f:强制删除文件或目录

小结

总体来说,这篇博文的产生是来源于tree和rm -rf -i的操作引起的,因为看见了删除过程中的递归删除,先进行递到末目录,然后归来删除。再接再厉吧,感觉Linux还是挺有意思的。