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在恢復文件的時候能不能自動創建空文件和目錄?

答:不能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM