• Linux--vim编辑器和文件恢复


    第五章  Vim编辑器和恢复ext4下误删除的文件-Xmanager工具

    本节所讲内容:

    5.1  vim的使用

    5.2  实战:恢复ext4文件系统下误删除的文件

    5.3  实战:使用xmanager等远程连接工具管理Linux

     

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

    确保系统已经安装了VIM工具

    [root@panda ~]# rpm -qf `which vim`

    [root@panda ~]# rpm -qf `which vi`

    扩展:

    问:vi和vim是同一个软件包安装的吗?

    答:NO,vim是vi的增加版,最明显的区别就是vim可以语法加亮,它完全兼容vi

    5.1.1  vim编辑器模式

     

    首次进入文件    ---- 命令模式

    出现 “Insert” ---- 编辑模式

    输入:          ---- 命令行模式

    A:从编辑模式到命令行模式怎样切换?         

            编辑模式->esc->命令模式->: ->命令行模式

    B:字符操作(怎样进入编辑模式?)

            进入编辑模式 a i o  A I O

    说明:

    i 当前字符之前插入 (光标前)

    I 行首插入  (行首)

    a 当前字符之后插入 (光标后)

    A 行尾插入(行尾)

    o下一行插入 (另起一行)

    O上一行插入(上一行插入)

    x 向后删除一个字符         等同于delete

    X 向前删除一个字符            

    u 撤销一步   每按一次就撤销一次

    r 替换

     

    5.1.2 在命令模式下做的操作:

    光标定位

    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可以进行补全操作,所需要的内容必须是在当前打开的文件内存在的,它只针对当前文件

     

    5.1..3 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

     

    5.1.5 自定义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

     

    5.1.6  其它编辑器

    nano编辑器

    emacs编辑器

    GHOME编辑器gedit

    例:

    [root@xuegod63 ~]# gedit /etc/passwd

     

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

    实验环境:centos7.4 现在系统默认使用的语言是汉语。(系统中必须安装好中文包)。

    将同目录下“a此文件在windows下打开正常-到linux下vim打开是乱码.txt”上传到Linux服务器上。使用ssh远程连接到Linux上,使用vim打开显示乱码。

    原因:编码的问题

    通过iconv命令转码   没有使用过:1

    参数:

    -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 "学神IT"

    信息:
    -l, --list 列举所有已知的字符集

    5.1.8  实战2:解决将公司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类型。

     

    5.2  实战:在Centos6/RHEL6上恢复ext4文件系统下误删除的文件

     

    [root@xuegod63 ~]# rm -Rf /    #执行不成功的,

    rm: 在"/" 进行递归操作十分危险

    rm: 使用 --no-preserve-root 选项跳过安全模式

    [root@xuegod63 ~]# rm -rf /*    #这个可以执行成功。 呵呵。。。

     

    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块:真正存储数据的地方

    逻辑删除:

    为什么删除比复制快?

     

    误删除文件后,第一件事要做什么???  你不心删除把存了几十年的大片删除了。

    避免误删除的文件内容被覆盖。 如何避免?

    卸载需要恢复文件的分区或以只读的方式挂载

     

    5.2.2   实战:在ext4文件系统上恢复被误删除的文件

    下载extundelete

    http://sourceforge.net/    开源软件发布中心

    准备测试分区:

    [root@xuegod63 /]# fdisk /dev/sda  #创建一个sda4分区

     

    WARNING: DOS-compatible mode is deprecated. It's strongly recommended to

             switch off the mode (command 'c') and change display units to

             sectors (command 'u').

     

    Command (m for help): p   #查看现有分区表

     

    Disk /dev/sda: 21.5 GB, 21474836480 bytes

    255 heads, 63 sectors/track, 2610 cylinders

    Units = cylinders of 16065 * 512 = 8225280 bytes

    Sector size (logical/physical): 512 bytes / 512 bytes

    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disk identifier: 0x000b8b35

     

       Device Boot      Start         End      Blocks   Id  System

    /dev/sda1   *           1          26      204800   83  Linux

    Partition 1 does not end on cylinder boundary.

    /dev/sda2              26        1301    10240000   83  Linux

    /dev/sda3            1301        1428     1024000   82  Linux swap / Solaris

     

    Command (m for help): n   #创建一个新分区

    Command action

       e   extended

       p   primary partition (1-4)

    p  #创建一个主分区

    Selected partition 4

    First cylinder (1428-2610, default 1428):

    Using default value 1428

    Last cylinder, +cylinders or +size{K,M,G} (1428-2610, default 2610): +1G  #指定分区大小

     

    Command (m for help): w  #保存

    The partition table has been altered!

     

    Calling ioctl() to re-read partition table.

     

    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.

    The kernel still uses the old table. The new table will be used at

    the next reboot or after you run partprobe(8) or kpartx(8)

    Syncing disks.

    [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/   #挂载

     

    5.2.3   复制一些测试文件,然后把这些文件再删除,然后演示恢复:

    [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

    5.2.4  安装extundelet 

    上传extundelete到linux中:

    从windows上传extundelete文件到linux,安装xmanager  v5   或者CRT

    [root@xuegod63 ~]# rpm -ivh /mnt/Packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm 

    安装后,就有了rz命令和sz命令

    rz : 上传windows中的文件到linux

    sz :下载,将linux中的文件传到windows

     

    解压并安装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/

    5.2.5  开始恢复:

    方法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在恢复文件的时候能不能自动创建空文件和目录?

    答:不能。

     

  • 相关阅读:
    app.config应该放哪?
    Connection 和Dispose的学习日志
    简单的sqlhelper的学习日志
    EF 事务(非分布式事务)
    Angularjs 地址联动2.1.1
    C# 如何物理删除有主外键约束的记录?存储过程实现
    C# 枚举基本用法及扩展方法
    JS 去除重复元素的方法
    MVC4程序运行报错
    ASP.NET MVC4 & Entity Framework 6.0 IIS 部署出错解决方案
  • 原文地址:https://www.cnblogs.com/fqfanqi/p/10035657.html
Copyright © 2020-2023  润新知