首页 > 技术 > Linux系统 > Vim 编辑器和恢复 ext4 下误删除的文件

Vim 编辑器和恢复 ext4 下误删除的文件

vim 主要模式介绍,vim 命令模式。

确保系统已经安装了 VIM 工具
[root@panda ~]# rpm -qf `which vim`
[root@panda ~]# rpm -qf `which vi`

vim 编辑器模式
首次进入文件	---- 命令模式
出现	“Insert” ---- 编辑模式
输入:	---- 命令行模式

A:从编辑模式到命令行模式怎样切换?
编辑模式->esc->命令模式->: ->命令行模式
B:字符操作(怎样进入编辑模式?)
进入编辑模式 a i o A I O
说明:
i 当前字符之前插入 (光标前)
I 行首插入 (行首)
a 当前字符之后插入 (光标后)
A 行尾插入(行尾)
o 下一行插入 (另起一行)
O 上一行插入(上一行插入)
x 向后删除一个字符 等同于 delete
X 向前删除一个字符
u 撤销一步 每按一次就撤销一次
r 替换

在命令模式下做的操作:

光标定位
hjkl 左下上右
0 和 home 键表示切换到行首, $和 end 键表示切换到行尾
gg 快速定位到文档的首行 , G 定位到未行
3gg 或者 3G 快速定位到第 3 行
/string(字符串) -----找到或定位你要找的单词或内容,如果相符内容比较多,我们可以通过 N、 n 来进行向上向下
查找,并且 vi 会对查找到的内容进行高亮显示,取消用 :noh
/^d ----^意思表示以什么开头 ,,查找以字母 d 开头的内容
/t$ -----$意思表示以什么结尾,,查找以字母 t 结尾的内容

vim + a.txt 打开文件后,光标会自动位于文件的最后一行
如何对文本进行编辑
删除、复制、粘贴、撤销
y 复制(以字符为单位) :表示对单个字符进行复制,如果要复制整行,用 yy(以行为单位)
复制 N 行: Nyy ,比如: 2yy ,表示复制 2 行
dd(删除,以行为单位,删除当前光标所在行)
删除 N 行: Ndd ,比如: 2dd ,表示删除 2 行
p : P 粘贴
剪切: dd
x 删除光标所在位置的字符
D 从光标处删除到行尾
u 撤销操作
ctrl+r 还原撤销过的操作,将做过的撤销操作再还原回去,也就是说撤销前是什么样,再还原成什么样
r 替换,或者说用来修改一个字符
总结:vim 如何进入其它模式
a A o O i I 都是可以进行插入,编辑模式
: 进入命令行模式
v 进入可视模式
ctrl+v 进入可视块模式
V 进入可视行模式
R 擦除、改写,进入替换模式
你进入以上模式后,想要退出 ,按 esc
扩展:插入模式中的操作
ctrl+p 可以进行补全操作,所需要的内容必须是在当前打开的文件内存在的,它只针对当前文件

V 模式(列)

进入 v 模式 移动光标选择区域、
编程的时候需要进行多行注释:
1)、 ctrl+v 进入列编辑模式
2)、 向下或向上移动光标,把需要注释、编辑的行的开头选中起来
4)、 然后按大写的 I
5)、 再插入注释符或者你需要插入的符号,比如"#"
6)、 再按 Esc,就会全部注释或添加了
删除:再按 ctrl+v 进入列编辑模式;向下或向上移动光标 ;选中注释部分,然后按 d, 就会删除注释符号

5.1.4 命令行模式操作
:w 保存 save
:w! 强制保存
:q 没有进行任何修改,退出 quit
:q! 修改了,不保存,强制退出
:wq 保存并退出
:wq! 强制保存并退出
:x 保存退出
例: wq! 强制保存并退出
[root@xuegod63 ~]# ll /etc/shadow
----------. 1 root root 1179 9 月 19 12:57 /etc/shadow
[root@xuegod63 ~]# vim /etc/shadow
调用外部文件或命令
假设:我想要写入我的网卡 MAC 地址,,我要查看一下,当前在 vim 编辑文档,照着写。这样好麻烦。
在命令行模式下操作:
:!ifconfig调用系统命令
!+命令
读取其他文件。(把其他文件中的内容追加到当前文档中)
:r /etc/hosts
文本替换
格式 : 范围(其中%所有内容) s 分隔符 旧的内容 分隔符 新的内容 (分隔符可以自定义)
默认是每一行的第一个符合要求的词 (/g 全部)
:1,3 s/bin/xuegod 替换第 1 到 3 行中出现的第一个 bin 进行替换为 xuegod
:1,3 s/bin/xuegod/g 替换第 1 到 3 行中查找到所有的 bin 进行替换为 xuegod
:3 s/xue/aaaaa #只把第 3 行中内容替换了
:% s/do/xuegod/g	将文本中所有的 do 替换成 xuegod
:% s/do/xuegod/gi	将文本中所有的 do 替换成 xuegod, 并且忽略 do 的大小写
:% s@a@b@g	将文本中所有的 a 替换成 b
 

自定义 vim 使用环境
临时设置
:set nu 设置行号
:set nonu 取消设置行号
:noh 取消高亮显示
永久设置环境
vim /etc/vimrc 设置后会影响到系统所有的用户
~/.vimrc #在用户的家目录下,创建一个.vimrc。这样只影响到某一个用户,没有自己建一个
例:
[root@xuegod63 ~]# cat /root/.vimrc
set nu
[root@xuegod63 ~]# vim /root/.vimrc
vim 打开多个文件
方法 1:以上下形势,打开两个文档
[root@xuegod63 ~]# vim -o /etc/passwd /etc/hosts
方法 2:以左右方式打开两个文档
[root@xuegod63 ~]# vim -O /etc/passwd /etc/hosts
注:ctrl+ww 在两文档之间进行切换编辑。大写 O 左右分屏,小写的 o 上下分屏
比较两个文件内容
[root@xuegod63 ~]# cp /etc/passwd mima.txt
[root@xuegod63 ~]# echo aaa >> mima.txt
[root@xuegod63 ~]# diff /etc/passwd mima.txt
40a41
> aaa
[root@xuegod63 ~]# vimdiff /etc/passwd mima.txt
 

其它编辑器

nano 编辑器
emacs 编辑器
GHOME 编辑器 gedit
例:
[root@xuegod63 ~]# gedit /etc/passwd

 实战 1:在 windows 中编辑好的汉字文本文档,上传到 Linux 下打开乱码

实验环境:centos7.4 现在系统默认使用的语言是汉语。(系统中必须安装好中文包)。
将同目录下“a 此文件在 windows 下打开正常-到 linux 下 vim 打开是乱码.txt”上传到 Linux 服务器上。使
用 ssh 远程连接到 Linux 上,使用 vim 打开显示乱码。
原因:编码的问题
通过 iconv 命令转码
参数:
-f, --from-code=名称 原始文本编码
-t, --to-code=输出编码
-o, --output=FILE 输出文件名
[root@xuegod63 ~]# mkdir test #创建一个测试目录
[root@xuegod63 ~]# cd test/
将测试的文件上传到 Linux 服务器上:
[root@xuegod63 ~]# iconv -f gb2312 -t utf8 a 此文件在 windows 下打开正常-到 linux 下 vim 打开
是乱码.txt -o aa.txt
[root@xuegod63 ~]# cat aa.txt
#!/bin/bash
echo 
信息:
-l, --list 列举所有已知的字符集

解决将公司 Linux 服务器上脚本导到 windows 上打开串行的问题

原因:因为 windows 和 linux 处理回车方法不同。
上传” b 在 Linux 编辑的文档到 windows 下没有换行.sh” 到 Linux 上,打开后正常显示
[root@localhost test]# sz b 在 Linux 编辑的文档到 windows 下没有换行.sh #发送到本地
在 window 上打开显示:
解决方法:
[root@xuegod63 ~]# rpm -ivh /mnt/Packages/dos2unix-6.0.3-7.el7.x86_64.rpm
注:在 centos7 上,unix2dos 这个命令已经被集成到 dos2unix-6.0.3-7.el7.x86_64.rpm 包中。在 centos6
下需要安装 unix2dos.xxx.rpm。
[root@localhost test]# unix2dos b 在 Linux 编辑的文档到 windows 下没有换行.sh
[root@localhost test]# sz b 在 Linux 编辑的文档到 windows 下没有换行.sh #发送到 windows 本地
显示正常。
注:dos2unix 这个命令是把 windows 下的回车转成 linux 类型。

在 Centos6/RHEL6 上恢复 ext4 文件系统下误删除的文件、

ext4 文件系统上删除文件,可以恢复: extundelete ,ext3 恢复使用:ext3grep
windows 恢复误删除的文件: final data v2.0 汉化版 和 easyrecovery
扩展:
Linux 文件系统由三部分组成:文件名,inode,block
windows 也由这三部分组成。
a.txt -->inode --> block
文件名 存放文件元数据信息 真正存放数据

查看文件文件名:
[root@xuegod63 ~]# cp /etc/passwd a.txt
[root@xuegod63 ~]# ls a.txt
a.txt

查看 inode 号:
常识: 每个文件,有一个 inode 号。
[root@xuegod63 ~]# ls -i a.txt
440266 a.txt

查看 inode 中的文件属性; 通过 stat 命令查看 inode 中包含的内容
[root@xuegod63 ~]# stat a.txt #查看 inode 信息:
[root@xuegod63 ~]# ls -l a.txt
-rw-r--r-- 1 root root 1720 Oct 25 10:21 a.txt

block 块:真正存储数据的地方
为什么删除比复制快,逻辑删除:
避免误删除的文件内容被覆盖。卸载需要恢复文件的分区或以只读的方式挂载

在 ext4 文件系统上恢复被误删除的文件
下载 extundelete
http://sourceforge.net/ 开源软件发布中心
准备测试分区
重新加载分区表
[root@xuegod63 ~]#reboot
或
[root@xuegod63 ~]# partx -a /dev/sda #获得新分区表

如果在根下删除文件了,想恢复,怎么办?
方法 1: 立即断电,然后把磁盘以只读方式,挂载到另一个电脑中进行恢复
方法 2:把 extundelete 在虚拟机上(虚拟机系统要和服务器版本一样),提前安装好后再复制到 U 盘中,把 U 盘插入
服务器,恢复时,恢复的文件要保存到 U 盘中,(不要让恢复的数据写到/下,那样会覆盖之前删除的文件)

使用新的分区表:
[root@xuegod63 /]# mkdir /tmp/sda4 #创建挂载点
[root@xuegod63 ~]# mkfs.ext4 /dev/sda4 #格式化
[root@xuegod63 ~]# mount /dev/sda4 /tmp/sda4/ #挂载

复制一些测试文件,然后把这些文件再删除,然后演示恢复:
[root@xuegod63 ~]# cp /etc/passwd /tmp/sda4/
[root@xuegod63 ~]# cp /etc/hosts /tmp/sda4/
[root@xuegod63 ~]# echo aaa > a.txt
[root@xuegod63 ~]# mkdir -p /tmp/sda4/a/b/c
[root@xuegod63 ~]# cp a.txt /tmp/sda4/a/
[root@xuegod63 ~]# cp a.txt /tmp/sda4/a/b/
[root@xuegod63 ~]# touch /tmp/sda4/a/b/kong.txt

安装 tree 命令:
[root@xuegod63 ~]# rpm -ivh /mnt/Packages/tree-1.5.3-2.el6.x86_64.rpm
[root@xuegod63 ~]# tree /tmp/sda4/
/tmp/sda4/
├── a
│ ├── a.txt
│ └── b
│ ├── a.txt
│ ├── c #空目录
│ └── kong.txt #空文件
├── hosts
├── lost+found
└── passwd

删除文件:
[root@xuegod63 ~]# cd /tmp/sda4/
[root@xuegod63 sda4]# ls
a hosts lost+found passwd
[root@xuegod63 sda4]# rm -rf a hosts passwd
误删除文件后,如何避免误删除的文件内容被覆盖
卸载需要恢复文件的分区:或以只读的方式挂载
[root@localhost ~]#cd /root
[root@localhost ~]# umount /tmp/sda4

解压并安装 extundelet
[root@xuegod63 extundelete-0.2.4]# tar jxvf extundelete-0.2.4.tar.bz2
[root@xuegod63 ~]# cd extundelete-0.2.4
[root@xuegod63]# yum install e2fsprogs-devel
[root@xuegod63 extundelete-0.2.4]# ./configure #检查系统安装环境
[root@xuegod63 extundelete-0.2.4]# make -j 4 #编译,把源代码编译成可执行的二进制文件。
-j 4 使用 4 进程同时编译,提升编译速度 或 使用 4 核 CPU 同时编译。
[root@xuegod63 extundelete-0.2.4]# make install #安装
install 和 cp 有什么区别?
install 复制时可以指定权限 cp 不可以
例:
[root@xuegod63 ~]# install -m 777 /bin/find /opt/a.sh
[root@xuegod63 ~]# ll /opt/

开始恢复:
方法 1:通过 inode 结点恢复
方法二:通过文件名恢复
方法三:恢复某个目录,如目录 a 下的所有文件:
方法四:恢复所有的文件
[root@xuegod63 ~]# umount /tmp/sda4/
[root@xuegod63 ~]# mkdir test #创建一个目录使用于存放恢复的数据
[root@xuegod63 ~]# cd test/

方法 1:
通过 inode 结点查看被删除的文件名字:
[root@xuegod63 test]# extundelete /dev/sda4 --inode 2
. 2
lost+found 11
passwd 12 Deleted
hosts 13 Deleted
a 7313 Deleted
扩展:ext4 文件系统的分区根目录的 inode 值为 2,xfs 分区根目录的 inode 值为 64
[root@xuegod63 test]# ls -id /boot/ #xfs 文件系统
64 /boot/
[root@xuegod63 test]# mount /dev/sda4 /tmp/sda4/
[root@xuegod63 test]# ls -id /tmp/sda4/
2 /tmp/sda4/
[root@xuegod63 test]# umount /tmp/sda4/

方法 1:通过 inode 结点恢复
[root@xuegod63 test]# extundelete /dev/sda4 --restore-inode 12
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 9 groups loaded.
Loading journal descriptors ... 63 descriptors loaded.
[root@xuegod63 test]# ls
RECOVERED_FILES
[root@xuegod63 test]# diff /etc/passwd RECOVERED_FILES/file.12 # 没有任何输出,说明一样

方法二,通过文件名恢复
[root@xuegod63 test]# extundelete /dev/sda4 --restore-file passwd
[root@xuegod63 test]# diff /etc/passwd RECOVERED_FILES/passwd # 没有任何输出,说明一样

方法三:恢复某个目录,如目录 a 下的所有文件:
[root@xuegod63 test]# extundelete /dev/sda4 --restore-directory a
[root@xuegod63 test]# tree RECOVERED_FILES/a/
RECOVERED_FILES/a/
├── a.txt
└── b
└── a.txt

下面是原来的目录结构:
[root@xuegod63 ~]# tree /root/sda4-back/a/
/root/sda4-back/a/
├── a.txt
└── b
├── a.txt
├── c
└── kong.txt

方法四:恢复所有的文件
[root@xuegod63 test]# extundelete /dev/sda4 --restore-all
删除前后的数据:
extundelete 在恢复文件的时候不能自动创建空文件和目录所以之前为空的将不会被恢复


  •   正在提交中,请稍候...
      评论提交成功
    回复 的评论,点击取消回复。