• 05Linux基础-vim编辑器和恢复ext4下误删除的文件


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

    1.1vim编辑器模式

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

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

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

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

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

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

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

    说明:

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

    I 行首插入  (行首)

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

    A 行尾插入(行尾)

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

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

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

    X 向前删除一个字符     

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

    r 替换

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

     

    1.3 V模式(列)

    进入v模式 移动光标选择区域、

    编程的时候需要进行多行注释:
    1)ctrl+v 进入列编辑模式

    2)、向下或向上移动光标,把需要注释、编辑的行的开头选中起来

    4)、然后按大写的I

    5)、再插入注释符或者你需要插入的符号,比如"#"

    6)、再按Esc,就会全部注释或添加了

    删除:再按ctrl+v 进入列编辑模式;向下或向上移动光标 选中注释部分,然后按d, 就会删除注释符号。

     

    1.4 命令行模式操作

    :w 保存 save

    :w! 强制保存

    :q 没有进行任何修改,退出 quit

    :q! 修改了,不保存,强制退出

    :wq 保存并退出

    :wq! 强制保存并退出

    :x 保存退出

    : wq! 强制保存并退出

    [root@localhost ~]# ll /etc/shadow

    ----------. 1 root root 1179 9月  19 12:57 /etc/shadow

    [root@localhost ~]# 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

     

    1.5 自定义vim使用环境

    临时设置

    :set nu  设置行号

    :set nonu 取消设置行号

    :noh   取消高亮显示

    永久设置环境

    vim /etc/vimrc  设置后会影响到系统所有的用户

    ~/.vimrc   #在用户的家目录下,创建一个.vimrc。这样只影响到某一个用户,没有自己建一个

    例:

    [root@localhost ~]# cat  /root/.vimrc  

    set nu

    [root@localhost ~]# vim  /root/.vimrc

    vim打开多个文件

    方法1:以上下形势,打开两个文档

    [root@localhost ~]# vim -o /etc/passwd /etc/hosts

    方法2:以左右方式打开两个文档

    [root@localhost ~]# vim -O /etc/passwd /etc/hosts

    注:ctrl+ww  在两文档之间进行切换编辑。大写O左右分屏,小写的o上下分屏

    比较两个文件内容

    [root@localhost ~]# cp /etc/passwd mima.txt

    [root@localhost ~]# echo aaa >> mima.txt

    [root@localhost ~]# diff /etc/passwd mima.txt

    40a41

    > aaa

    [root@localhost ~]# vimdiff /etc/passwd mima.txt

    1.6  其它编辑器

    nano编辑器

    emacs编辑器

    GHOME编辑器gedit

    例:

    [root@localhost ~]# 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@localhost ~]# mkdir test  #创建一个测试目录

    [root@localhost ~]# cd test/

    将测试的文件上传到Linux服务器上:

    [root@localhost ~]# iconv -f gb2312  -t utf8 a此文件在windows下打开正常-到linux下vim打开是乱码.txt  -o aa.txt

    [root@localhost ~]# 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@localhost ~]# 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类型。

     

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

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

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

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

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

    ext4文件系统上删除文件,可以恢复: extundelete ,ext3恢复使用:ext3grep

    windows恢复误删除的文件:  final data v2.0 汉化版  和  easyrecovery  

    扩展:

    Linux文件系统由三部分组成:文件名,inode,block

    windows也由这三部分组成。

    a.txt          -->inode              --> block

    文件名       存放文件元数据信息       真正存放数据

    查看文件文件名:

    [root@localhost ~]# cp /etc/passwd a.txt

    [root@localhost ~]# ls a.txt

    a.txt

    查看inode号:

    常识: 每个文件,有一个inode号。

    [root@localhost ~]# ls -i a.txt

    440266 a.txt

    查看inode中的文件属性;  通过stat命令查看inode中包含的内容

    [root@localhost ~]# stat a.txt   #查看inode信息:

    [root@localhost ~]# 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@localhost /]# 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@localhost ~]#reboot

    [root@localhost ~]# partx -a /dev/sda  #获得新分区表

    扩展:

    如果在根下删除文件了,想恢复,怎么办?

    方法1: 立即断电,然后把磁盘以只读方式,挂载到另一个电脑中进行恢复

    方法2:把extundelete在虚拟机上(虚拟机系统要和服务器版本一样),提前安装好后再复制到U盘中,把U盘插入服务器,恢复时,恢复的文件要保存到U盘中,(不要让恢复的数据写到/下,那样会覆盖之前删除的文件)

    使用新的分区表:

    [root@localhost /]# mkdir /tmp/sda4     #创建挂载点

    [root@localhost ~]# mkfs.ext4 /dev/sda4    #格式化

    [root@localhost ~]# mount /dev/sda4 /tmp/sda4/   #挂载

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

    [root@localhost ~]# cp /etc/passwd /tmp/sda4/

    [root@localhost ~]# cp /etc/hosts /tmp/sda4/

    [root@localhost ~]# echo aaa > a.txt

    [root@localhost ~]# mkdir -p /tmp/sda4/a/b/c

    [root@localhost ~]# cp a.txt /tmp/sda4/a/

    [root@localhost ~]# cp a.txt /tmp/sda4/a/b/

    [root@localhost ~]# touch /tmp/sda4/a/b/kong.txt

    安装tree命令:

    [root@localhost ~]# rpm -ivh /mnt/Packages/tree-1.5.3-2.el6.x86_64.rpm

    [root@localhost ~]# tree /tmp/sda4/

    /tmp/sda4/

    ├── a

    │   ├── a.txt

    │   └── b

    │       ├── a.txt

    │       ├── c  #空目录

    │       └── kong.txt  #空文件

    ├── hosts

    ├── lost+found

    └── passwd

    删除文件:

    [root@localhost ~]# cd /tmp/sda4/

    [root@localhost sda4]# ls

    a  hosts  lost+found  passwd

    [root@localhost sda4]# rm -rf a hosts passwd

    误删除文件后,第一件事要做什么???

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

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

    [root@localhost ~]#cd /root

    [root@localhost ~]# umount /tmp/sda4

    5.2.4  安装extundelet  

    上传extundeletelinux中:

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

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

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

    rz : 上传windows中的文件到linux

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

    解压并安装extundelet

    [root@localhost extundelete-0.2.4]# tar jxvf extundelete-0.2.4.tar.bz2

    [root@localhost ~]# cd extundelete-0.2.4

    [root@localhost]# yum install e2fsprogs-devel

    [root@localhost extundelete-0.2.4]# ./configure   #检查系统安装环境

    [root@localhost extundelete-0.2.4]# make  -j 4  #编译,把源代码编译成可执行的二进制文件。

    -j 4   使用4进程同时编译,提升编译速度 或 使用4核CPU同时编译。

    [root@localhost extundelete-0.2.4]# make install  #安装

    install 和cp 有什么区别?

    install 复制时可以指定权限  cp不可以

    例:

    [root@localhost ~]# install -m 777 /bin/find /opt/a.sh

    [root@localhost ~]# ll /opt/

    5.2.5  开始恢复:

    方法1:通过inode结点恢复

    方法二:通过文件名恢复

    方法三:恢复某个目录,如目录a下的所有文件:

    方法四:恢复所有的文件

    [root@localhost ~]# umount /tmp/sda4/

    [root@localhost ~]# mkdir test  #创建一个目录使用于存放恢复的数据

    [root@localhost ~]# cd test/

    方法1:

    通过inode结点查看被删除的文件名字:

    [root@localhost 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@localhost test]# ls -id /boot/   #xfs文件系统

    64 /boot/

    [root@localhost test]# mount /dev/sda4 /tmp/sda4/

    [root@localhost test]# ls -id /tmp/sda4/

    2 /tmp/sda4/

    [root@localhost test]# umount /tmp/sda4/

    方法1:通过inode结点恢复

    [root@localhost 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@localhost test]# ls

    RECOVERED_FILES

    [root@localhost test]# diff /etc/passwd RECOVERED_FILES/file.12  # 没有任何输出,说明一样

    方法二,通过文件名恢复

    [root@localhost test]# extundelete /dev/sda4 --restore-file passwd

    [root@localhost test]# diff /etc/passwd RECOVERED_FILES/passwd  # 没有任何输出,说明一样

    方法三:恢复某个目录,如目录a下的所有文件:

    [root@localhost test]# extundelete /dev/sda4 --restore-directory a

    [root@localhost test]# tree RECOVERED_FILES/a/

    RECOVERED_FILES/a/

    ├── a.txt

    └── b

    └── a.txt

    下面是原来的目录结构:

    [root@localhost ~]# tree /root/sda4-back/a/

    /root/sda4-back/a/

    ├── a.txt

    └── b

        ├── a.txt

        ├── c

    └── kong.txt

    方法四:恢复所有的文件

    [root@localhost test]# extundelete /dev/sda4 --restore-all

    删除前后的数据:

     

  • 相关阅读:
    linux awk命令详解
    Linux 大页面使用与实现简介(转)
    二层设备与三层设备的区别--总结
    Windows下的cd命令
    linux常用命令
    上班第一天
    linux 内核移植和根文件系统的制作
    Sizeof与Strlen的区别与联系
    嵌入式软件工程师面试题
    SpringBoot简单打包部署(附工程)
  • 原文地址:https://www.cnblogs.com/hackerlin/p/11270553.html
Copyright © 2020-2023  润新知