1、首先需要將遷移的目的盤(pán)的原有分區(qū)抹除,重新分區(qū)成與現(xiàn)有分區(qū)完全一致的分區(qū),主分區(qū)大小可以不一致,boot分區(qū)和swap分區(qū)盡量一致。分區(qū)可以用fdisk工具。當(dāng)然也需要寫(xiě)入文件系統(tǒng),文件系統(tǒng)類(lèi)型也保持一致。這些工作完成以后,將主分區(qū)掛載到當(dāng)前系統(tǒng)的/mnt目錄下。接下來(lái)可以通過(guò)tar工具進(jìn)行打包了,具體的命令為sudotar-xzvfparchlinux.tar.gz--exclude=/proc--exclude=/sys--exclude=/run--exclude=/tmp--exclude=/lost+found--exclude=/mnt/
創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)提供額濟(jì)納企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為額濟(jì)納眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
2、進(jìn)入安裝盤(pán)環(huán)境之后,掛載目的盤(pán),包括主分區(qū)和boot分區(qū)。然后使用genfstab-U/mnt/mnt/etc/fstab命令重新生成fstab。之后arch-chroot進(jìn)入系統(tǒng),通過(guò)grub-mkconfig/boot/grub/grub.cfg和grub-instal--target=x86_64-efi--efi-directory=/boot
tar 的功能類(lèi)似于 Windows 中的 WinRAR。它可以將多個(gè)目錄或文件打包成一個(gè)大文件,在打包的過(guò)程中還可以透過(guò) gzip/bzip2/xz 的支持,對(duì)文件進(jìn)行壓縮 1 。
tar 的選項(xiàng)參數(shù)很多,主要用到的有以下這些:
還是太多,記不住怎么辦? 記住下面這些最常用的命令即可:
總結(jié)一下:z 為gzip;j 為bzip2;J 為xz。c 為壓縮;t 為查詢;x 為解壓縮。最后跟著 vf。f 一定要是最后一個(gè),如果放在其他選項(xiàng)之前,tar 就會(huì)把文件名搞錯(cuò)。比如 tar -zcfv xxx 命令,tar 指令就會(huì)認(rèn)為壓縮文件名為 v!
壓縮的文件名稱(chēng)要根據(jù)壓縮算法加上響應(yīng)的后綴:
只有知道了壓縮算法,我們才能解的出來(lái),你說(shuō)是嗎?所以文件名規(guī)范很重要。
假設(shè)我們需要備份 /etc 文件夾,把它打成一個(gè)壓縮包 1 。這在實(shí)際應(yīng)用中很常見(jiàn),因?yàn)?/etc 文件夾存放了系統(tǒng)主要配置文件。在英文中完整單詞是etc.,也就是后面會(huì)帶上一個(gè)句點(diǎn),表示“等等”之意。
接下來(lái),我們分別使用 gzip、bzip2與 xz 算法對(duì) /etc 文件夾進(jìn)行打包壓縮。
gzip 壓縮指令: time tar -zpcvf /root/etc.tar.gz /etc
bzip2壓縮指令: time tar -jpcvf /root/etc.tar.bz2 /etc
xz 壓縮指令: time tar -Jpcvf /root/etc.tar.xz /etc
從 real 中可以看出: gzip 的壓縮速度最快,而 xz 的壓縮速度最慢。
從大小上來(lái)看,xz 的壓縮率最高,而gzip 壓縮率最差。
壓縮率高,自然需要時(shí)間成本。因此需要壓縮的文件夾很大,那么就要多多考慮時(shí)間成本咯。因?yàn)?gzip 壓縮速度快,這也是 *.tar.gz 比較流行的原因之一。
假設(shè)有這樣一種場(chǎng)景:我們需要打包某個(gè)文件夾(/root),但這個(gè)文件夾中的某個(gè)文件或者子文件夾不想打包進(jìn)去(帶 etc 前綴)。也就是希望這個(gè)文件夾部分打包,部分不打包??梢詧?zhí)行以下指令:
tar -zcvf /root/test.tar.gz --exclude=/root/etc* --exclude=/root/test.tar.gz /root
加了 --exclude=/root/test.tar.gz 是為了排除自身,否則壓縮包中會(huì)包含一個(gè)大小為 0 的自身文件,這恐怕不是我們希望看到的:
通過(guò) tar -ztvf test.tar.gz 就可以查看剛剛新打的壓縮包中所包含的文件列表:
使用命令 tar -ztvf etc.tar.gz 查看剛剛打好的壓縮包。注意要使用匹配的解壓縮算法才能正確解壓,比如示例中是 gz 作為后綴,所以加了 -z 選項(xiàng)表示使用 gzip 算法進(jìn)行解壓。
部分輸出內(nèi)容:
可以看到該命令把文件的權(quán)限、賬戶以及歸屬組也一并打印出來(lái)了。
而且還有一點(diǎn)很關(guān)鍵,這些文件都沒(méi)有根目錄。如果沒(méi)有拿掉根目錄,解壓縮后的文件名就會(huì)是絕對(duì)路徑, 亦即解壓縮后的數(shù)據(jù)一定會(huì)被放置 到 /etc/xxx 去 1 !這樣系統(tǒng)的 /etc 文件夾就會(huì)被覆蓋,后果很?chē)?yán)重。所以,tar 打包指令默認(rèn)都會(huì)去除放入包中文件的根目錄。除非通過(guò) -P 顯示要求保留這些文件的根目錄。
(1)完全解壓
利用 tar -zxvf etc.tar.gz -C /tmp 命令把 etc.tar.gz 解壓到 /tmp。解壓成功后,就會(huì)在 /tmp 下看到 /etc 文件夾。
如果需要在本地路徑下直接解開(kāi),那直接執(zhí)行 tar -zxvf etc.tar.gz 即可。
(2)部分解壓
假設(shè)我們需要把壓縮包(etc.tar.gz)中的 vconsole.conf 解壓出來(lái)??梢韵葓?zhí)行以下命令,查詢出該文件所對(duì)應(yīng)的相對(duì)路徑:
tar -ztvf etc.tar.gz | grep ‘console’
拿到需要解壓的文件路徑之后,就可以執(zhí)行 tar -zxvf etc.tar.gz etc/vconsole.conf
進(jìn)入當(dāng)前目錄的 etc 文件夾,就可以看到 vconsole.conf 已經(jīng)被解壓出來(lái)了:
【1】 鳥(niǎo)哥. 鳥(niǎo)哥的Linux私房菜 基礎(chǔ)學(xué)習(xí)篇[M]. 第四版. 北京: 人民郵電出版社,2018:359-362.
Linux下進(jìn)行文件的解壓、復(fù)制、移動(dòng)應(yīng)該是最常見(jiàn)的操作了。尤其是我們?cè)陧?xiàng)目中使用大量的數(shù)據(jù)集文件(比如機(jī)器學(xué)習(xí))文件。然而使用這些命令時(shí)一不留神就會(huì)掉進(jìn)坑里,這篇文章我們就來(lái)細(xì)數(shù)用Shell進(jìn)行文件操作的這些坑。
Linux下壓縮文件的常見(jiàn)擴(kuò)展名包括 .gz , .tar , .tar.gz , .zip 等。這些壓縮格式都能夠跨平臺(tái)(Windows/Mac/Linux)使用。下面我們以 .zip 文件為例子來(lái)講解。我們已知一個(gè)文本文件壓縮包 test.zip ,想把它解壓,很簡(jiǎn)單,運(yùn)行 unzip 命令即可:
如果我們想要將 test.txt 重新壓縮呢?你可能情不自禁會(huì)執(zhí)行 zip test.txt ,然后我們發(fā)現(xiàn)提示:
其實(shí)是傳參數(shù)傳錯(cuò)了,導(dǎo)致 zip 誤把 test.txt 當(dāng)成壓縮后的文件名了,這當(dāng)然不是合法的。我們看 zip 的參數(shù)構(gòu)成:
[-b path] 是壓縮后的 .zip 文件的路徑, zipfile list 是待壓縮的文件列表。于是,我們這樣寫(xiě)即可成功壓縮:
當(dāng)然, zip 也支持將多個(gè)文件壓縮:
此時(shí)我們發(fā)現(xiàn)再解壓 test3.zip 會(huì)發(fā)現(xiàn)重新得到了兩個(gè)原始文件:
zip 也支持對(duì)目錄壓縮,如我們嘗試壓縮 test 目錄:
此時(shí)再解壓 test4.zip 則會(huì)重新生成 test 目錄:
不過(guò), zip 是將輸入的文件列表 分別 進(jìn)行壓縮的操作,即是對(duì)目錄來(lái)進(jìn)行壓縮也是對(duì)目錄內(nèi)的所有文件one-by-one的操作。那我們需要將很多文件先打包成一個(gè)文件,然后再壓縮呢?此時(shí)就要用到 tar 了。
很多人誤解 tar 是個(gè)壓縮命令,其實(shí)壓縮命令是 gzip 、 xz 以及我們上文提到的 zip 這些。 tar 是個(gè)打包命令,只不過(guò)附帶壓縮與解壓的功能。 tar 的選項(xiàng)多如牛毛,為了減輕大家的記憶負(fù)擔(dān),我們只介紹下面兩個(gè)選項(xiàng):
-c : 建立打包文件(可搭配 -v 將過(guò)程中打包的文件可視化);
-x :解包或解壓縮的功能(可搭配 -C 在特定目錄解壓);
(其實(shí)還有表示通過(guò)gzip進(jìn)行壓縮/解壓縮的 -z ,通過(guò)bzip2的支持進(jìn)行壓縮/解壓縮的 -j ,通過(guò)xz的支持進(jìn)行壓縮解壓縮的 -J 等,但我們這里統(tǒng)一用 .zip 示范,就省去這些參數(shù)了)
那么,我們只需要記住下面的命令即可:
壓縮: tar -cv -f filename.zip 要被壓縮的文件或目錄名稱(chēng)
解壓縮: tar -xv -f filename.zip -C 欲解壓的目錄(這個(gè)目錄必須已經(jīng)存在)
注意,壓縮傳參順序是壓縮后的.zip文件在前,壓縮前的文件在后 ,別搞錯(cuò)了。(讓人聯(lián)想到gcc編譯器,不過(guò) gcc 傳參時(shí)規(guī)定是 -o output_file.out 的形式來(lái)指定輸出的可執(zhí)行文件,就回避了這個(gè)順序問(wèn)題)
比如,我們要將 test 文件夾(該文件夾下有一個(gè) test.txt 文件)壓縮,可以運(yùn)行如下命令:
然后將其解壓到當(dāng)前目錄,可運(yùn)行如下命令:
多個(gè)文件壓縮:
然后將其解壓到當(dāng)前目錄:
由上面所說(shuō), zip / unzip 和 tar 都是壓縮什么解壓出來(lái)就是什么,原來(lái)是目錄就是目錄,原來(lái)沒(méi)目錄不會(huì)幫你自動(dòng)生成一個(gè)目錄 ,但Linux或Mac系統(tǒng)的可視化壓縮工具就不一樣了(在Mac中被稱(chēng)為「歸檔實(shí)用工具」)。Mac中對(duì)目錄壓縮時(shí)壓縮命令和 tar 命令是等效的,比如我們想用Mac自帶的壓縮工具壓縮 test 文件夾:
會(huì)生成對(duì)應(yīng)的歸檔文件:
再解壓會(huì)得到同樣的文件夾(會(huì)自動(dòng)幫我們重命名),不會(huì)幫我們生成多余的目錄:
這個(gè)文件夾內(nèi)部才是我們需要的文件:
它會(huì)自動(dòng)幫我們生成一個(gè)名為 歸檔.zip 的文件:
這個(gè)文件夾內(nèi)部才是我們需要的文件:
這個(gè)文件夾內(nèi)部才是我們需要的文件:
這在對(duì)大量文件操作時(shí)需要額外注意,否則會(huì)白白開(kāi)銷(xiāo)你一次拷貝文件的時(shí)間!
我們緊接著上面的情景。假設(shè)我們當(dāng)前的目錄為項(xiàng)目目錄,而我們手滑使用了系統(tǒng)自帶的可視化解壓工具生成了一個(gè)多余的目錄。我們接下來(lái)要把系統(tǒng)生成的多余的 歸檔 文件夾里的文件拷貝到當(dāng)前目錄,那么我們可以使用帶 r 參數(shù)的 cp 命令:
這里 -r 參數(shù)表示遞歸復(fù)制命令,用于目錄的遞歸復(fù)制。注意命令中的 歸檔/ 表示 歸檔 目錄下的所有文件,意思和 歸檔/* 相同:
選項(xiàng)參數(shù) -r 寫(xiě)成 -R 是等效的:
但如果直接傳入?yún)?shù) 歸檔 ,則表示將這個(gè)目錄整個(gè)地復(fù)制:
同一個(gè)目錄下不可能有兩個(gè)相同名稱(chēng)的子目錄,這當(dāng)然就會(huì)出錯(cuò),當(dāng)然我們可以將其復(fù)制到另外一個(gè)目錄里:
你可能要問(wèn),加 r 和不加 r 有啥區(qū)別?如果不加 r ,則默認(rèn)是跳過(guò)目錄的,也就是說(shuō)只能copy文件:
我們還是緊接著上面的場(chǎng)景。假定我們已經(jīng)將 歸檔 文件夾中的 test.txt 、 test2.txt 成功拷貝到當(dāng)前項(xiàng)目目錄了?,F(xiàn)在我們有了個(gè)新的需求:我們?cè)陧?xiàng)目目錄中建了一個(gè) data 子目錄,現(xiàn)在需要將項(xiàng)目目錄中的 test.txt 、 test2.txt 移動(dòng)到 data 子目錄中。這就需要如下命令:
注意,如果有多個(gè)源文件或目錄,則最后一個(gè)目標(biāo)文件(也就是這里的data)一定是目錄 。當(dāng)我們只移動(dòng)一個(gè)文件時(shí),就有潛在的二義性。這里因?yàn)? data 目錄本身存在,我們移動(dòng) test.txt 到 data 目錄還能正常執(zhí)行:
但是如果data目錄不存在,就會(huì)將 mv 解釋為重命名的意思,比如如果我們將 data 目錄刪除再執(zhí)行:
此時(shí)就等效于把 test.txt 更名為 data 文件:
可以看出,第一個(gè)字母是 - ,也就意味著 data 是普通文件,不是目錄(是目錄的話第一個(gè)字母是 d )。
因此,使用 mv 語(yǔ)句時(shí)要格外小心,因?yàn)樗扔幸苿?dòng)到目錄的作用,也有重命名的作用,一不注意就可能出錯(cuò)!
有移動(dòng)到目錄的作用,也有重命名的作用,一不注意就可能出錯(cuò)!
就可能出錯(cuò)!
打包
打包,也稱(chēng)為歸檔,指的是一個(gè)文件或目錄的集合,而這個(gè)集合被存儲(chǔ)在一個(gè)文件中。歸檔文件沒(méi)有經(jīng)過(guò)壓縮,因此,它占用的空間是其中所有文件和目錄的總和。通常,歸檔總是會(huì)和系統(tǒng)備份聯(lián)系在一起。
壓縮
壓縮是指利用算法將文件進(jìn)行處理,已達(dá)到保留最大文件信息,而讓文件體積變小的目的。其基本原理為,通過(guò)查找文件內(nèi)的重復(fù)字節(jié),建立一個(gè)相同字節(jié)的詞典文件,并用一個(gè)代碼表示。
壓縮和歸檔文件類(lèi)似,壓縮文件也是一個(gè)文件和目錄的集合,且這個(gè)集合也被存儲(chǔ)在一個(gè)文件中,但它們的不同之處在于,壓縮文件采用了不同的存儲(chǔ)方式,使其所占用的磁盤(pán)空間比集合中所有文件大小的總和要小。
由于計(jì)算機(jī)處理的信息是以二進(jìn)制的形式表示的,因此,壓縮軟件就是把二進(jìn)制信息中相同的字符串以特殊字符標(biāo)記,只要通過(guò)合理的數(shù)學(xué)計(jì)算,文件的體積就能夠被大大壓縮。把一個(gè)或者多個(gè)文件用壓縮軟件進(jìn)行壓縮,形成一個(gè)文件壓縮包,既可以節(jié)省存儲(chǔ)空間,又方便在網(wǎng)絡(luò)上傳送。
對(duì)文件進(jìn)行壓縮,很可能損壞文件中的內(nèi)容,因此,壓縮又可以分為有損壓縮和無(wú)損壓縮。
打包和壓縮的區(qū)別
打包指的是將多個(gè)文件和目錄集中存儲(chǔ)在一個(gè)文件中,而壓縮則指的是利用算法對(duì)文件進(jìn)行處理,從而達(dá)到縮減占用磁盤(pán)空間的目的。
Linux下,常用打包命令有2個(gè),分別是tar和dd;常用的壓縮命令有很多,比如gzip、zip、bzip2等。