3.1 Bài 1
Chứng chỉ: |
Linux Essentials |
---|---|
Phiên bản: |
1.6 |
Chủ đề: |
3 Sức mạnh của Dòng lệnh |
Mục tiêu: |
3.1 Lưu trữ Tệp trên Dòng lệnh |
Bài: |
1 trên 1 |
Giới thiệu
Nén dữ liệu được sử dụng để giảm lượng không gian mà một tập dữ liệu nhất định chiếm. Thông thường, nén dữ liệu được dùng để giảm lượng không gian cần thiết để lưu trữ một tệp tin. Một tác dụng phổ biến khác của nó là để giảm lượng dữ liệu được gửi qua kết nối mạng.
Nén dữ liệu hoạt động theo nguyên tắc thay thế các mẫu lặp đi lặp lại trong dữ liệu. Giả sử bạn có một cuốn tiểu thuyết. Trong đó, một số từ sẽ được sử dụng rất nhiều và cũng có nhiều ký tự, chẳng hạn như từ “the”. Bạn có thể giảm đáng kể kích thước của cuốn tiểu thuyết nếu bạn thay thế các từ và mẫu nhiều ký tự phổ biến trong cuốn sách này bằng các từ thay thế chỉ có một ký tự. Ví dụ: thay thế từ “the” bằng một chữ cái Hy Lạp không được sử dụng ở những nơi khác trong văn bản. Thuật toán nén dữ liệu cũng hoạt động tương tự như vậy nhưng phức tạp hơn.
Nén dữ liệu có hai loại là nén không tổn hao và nén có tổn hao. Mọi thứ được nén bằng thuật toán không tổn hao có thể được giải nén trở lại dạng ban đầu. Dữ liệu được nén bằng thuật toán có tổn hao sẽ không thể được khôi phục. Các thuật toán tổn hao thường được sử dụng cho hình ảnh, video và âm thanh mà con người không thể nhận thấy khi chất lượng bị giảm sút, không liên quan đến bối cảnh hoặc khi dung lượng hoặc thông lượng mạng được tiết kiệm quan trọng hơn tổn hao đó.
Các công cụ lưu trữ được sử dụng để gộp các tệp và thư mục vào một tệp duy nhất. Một số cách sử dụng phổ biến của các công cụ này là sao lưu, đóng gói mã nguồn phần mềm và lưu giữ dữ liệu.
Lưu trữ và nén dữ liệu thường đi đôi với nhau. Một số công cụ lưu trữ thậm chí còn mặc định nén nội dung của chúng. Những công cụ khác có thể tùy chọn nén nội dung hoặc không. Một vài công cụ lưu trữ phải được sử dụng cùng với các công cụ nén độc lập nếu bạn muốn nén nội dung.
Công cụ phổ biến nhất để lưu trữ tệp trên hệ thống Linux là tar
. Hầu hết các bản phân phối Linux đều có phiên bản GNU của tar
, vì vậy đây là sẽ phiên bản được sử dụng trong bài học này. Bản thân tar
chỉ quản lý việc lưu trữ tệp chứ không nén chúng.
Có rất nhiều công cụ nén có sẵn trên Linux. Một số định dạng không tổn hao phổ biến là bzip2
, gzip
và xz
. Bạn sẽ tìm thấy cả ba trên hầu hết các hệ thống. Bạn có thể bắt gặp một hệ thống cũ hoặc rất giản tiện mà trong đó xz
hoặc bzip
không được cài đặt. Nếu trở thành người dùng Linux phổ thông, bạn có thể sẽ gặp các tệp được nén bằng cả ba công cụ trên. Cả ba đều sử dụng các thuật toán khác nhau; do đó, một tệp được nén bằng công cụ này sẽ không thể được giải nén bằng công cụ kia. Công cụ nén cũng có sự đánh đổi. Nếu bạn muốn tỉ lệ nén cao thì quá trình nén và giải nén file sẽ lâu hơn. Điều này là do độ nén cao hơn đòi hỏi nhiều công việc hơn để tìm các mẫu phức tạp hơn. Tất cả các công cụ này đều có thể nén dữ liệu nhưng không thể tạo các kho lưu trữ chứa nhiều tệp.
Các công cụ nén độc lập thường không khả dụng trên các hệ thống Windows. Các công cụ lưu trữ và nén của Windows thường đi kèm với nhau. Hãy ghi nhớ điều này nếu bạn có hệ thống Linux và Windows cần chia sẻ tệp cho nhau.
Các hệ thống Linux cũng có các công cụ để xử lý các tệp .zip
thường được sử dụng trên hệ thống Windows. Chúng được gọi là zip
và unzip
. Các công cụ này không được cài đặt mặc định trên tất cả các hệ thống; vì vậy, nếu cần sử dụng chúng, bạn có thể sẽ phải cài đặt chúng. Điều may mắn ở đây là chúng thường được tìm thấy trong kho gói của các bản phân phối.
Công cụ Nén
Dung lượng ổ đĩa được tiết kiệm bằng cách nén tệp dựa trên một số yếu tố như bản chất của dữ liệu bạn đang nén, thuật toán được sử dụng để nén dữ liệu và mức độ nén. Không phải thuật toán nào cũng sẽ hỗ trợ nhiều mức nén khác nhau.
Hãy cùng bắt đầu với việc thiết lập một số tệp thử nghiệm để nén:
$ mkdir ~/linux_essentials-3.1 $ cd ~/linux_essentials-3.1 $ mkdir compression archiving $ cd compression $ cat /etc/* > bigfile 2> /dev/null
Bây giờ, chúng ta sẽ tạo ba bản sao của tệp này:
$ cp bigfile bigfile2 $ cp bigfile bigfile3 $ cp bigfile bigfile4 $ ls -lh total 2.8M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile2 -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile3 -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile4
Bây giờ, chúng ta sẽ nén các tệp bằng các công cụ nén đã được nhắc đến ở trên:
$ bzip2 bigfile2 $ gzip bigfile3 $ xz bigfile4 $ ls -lh total 1.2M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 170K Jun 23 08:08 bigfile2.bz2 -rw-r--r-- 1 emma emma 179K Jun 23 08:08 bigfile3.gz -rw-r--r-- 1 emma emma 144K Jun 23 08:08 bigfile4.xz
Hãy so sánh kích thước của tệp nén với tệp không bị nén có tên bigfile
. Cũng hãy lưu ý cách các công cụ nén đã thêm phần mở rộng vào tên tệp và xóa các tệp không nén.
Hãy sử dụng bunzip2
, gunzip
hoặc unxz
để giải nén các tệp:
$ bunzip2 bigfile2.bz2 $ gunzip bigfile3.gz $ unxz bigfile4.xz $ ls -lh total 2.8M -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile2 -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile3 -rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile4
Một lần nữa, hãy lưu ý rằng bây giờ tệp nén sẽ bị xóa sau khi được giải nén.
Một số công cụ nén có hỗ trợ nhiều mức nén khác nhau. Mức nén cao hơn thường yêu cầu nhiều bộ nhớ và chu kỳ CPU hơn, nhưng kết quả là tệp nén sẽ nhỏ hơn. Đối với các cấp thấp hơn thì ngược lại. Dưới đây là minh họa với xz
và gzip
:
$ cp bigfile bigfile-gz1 $ cp bigfile bigfile-gz9 $ gzip -1 bigfile-gz1 $ gzip -9 bigfile-gz9 $ cp bigfile bigfile-xz1 $ cp bigfile bigfile-xz9 $ xz -1 bigfile bigfile-xz1 $ xz -9 bigfile bigfile-xz9 $ ls -lh bigfile bigfile-* * total 3.5M -rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile -rw-r--r-- 1 emma emma 205K Jun 23 13:14 bigfile-gz1.gz -rw-r--r-- 1 emma emma 178K Jun 23 13:14 bigfile-gz9.gz -rw-r--r-- 1 emma emma 156K Jun 23 08:08 bigfile-xz1.xz -rw-r--r-- 1 emma emma 143K Jun 23 08:08 bigfile-xz9.xz
Không cần thiết phải giải nén một tệp mỗi khi bạn sử dụng nó. Các công cụ nén thường đi kèm với các phiên bản đặc biệt của các công cụ phổ biến được sử dụng để đọc tệp văn bản. Ví dụ: gzip
có một phiên bản của cat
, grep
, diff
, less
, more
và một vài phiên bản khác. Đối với gzip
, các công cụ sẽ có tiền tố là z
, với bzip2
là bz
và xz
là xz
. Dưới đây là một ví dụ về việc sử dụng zcat
để đọc hiển thị tệp được nén bằng gzip
:
$ cp /etc/hosts ./ $ gzip hosts $ zcat hosts.gz 127.0.0.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters
Công cụ Lưu trữ
Chương trình tar
có lẽ là công cụ lưu trữ được sử dụng rộng rãi nhất trên các hệ thống Linux. Trong trường hợp bạn đang thắc mắc tại sao nó được đặt tên như vậy, thì nó là viết tắt của “tape archive” (lưu trữ dạng băng). Các tệp được tạo bằng tar
thường được gọi là bóng tar. Việc các ứng dụng được phân phối dưới dạng mã nguồn ở dạng quả bóng tar là rất phổ biến.
Phiên bản GNU của tar
mà các bản phân phối Linux cung cấp có rất nhiều tùy chọn. Bài học này sẽ đề cập đến các tuỳ chọn được sử dụng phổ biến nhất.
Hãy bắt đầu bằng cách tạo một kho lưu trữ các tệp để nén:
$ cd ~/linux_essentials-3.1 $ tar cf archiving/3.1.tar compression
Tùy chọn c
sẽ hướng dẫn tar
tạo tệp lưu trữ mới và tùy chọn f
là tên của tệp cần tạo. Đối số ngay sau các tùy chọn sẽ luôn là tên của tệp phải nén. Phần còn lại của các đối số là đường dẫn đến bất kỳ tệp hoặc thư mục nào bạn muốn thêm vào, liệt kê hoặc trích xuất từ tệp. Trong ví dụ này, chúng ta đang thêm thư mục compression
và tất cả nội dung của nó vào kho lưu trữ.
Để xem nội dung của bóng tar, hãy sử dụng tùy chọn t
của tar
:
$ tar -tf 3.1.tar compression/ compression/bigfile-xz1.xz compression/bigfile-gz9.gz compression/hosts.gz compression/bigfile2 compression/bigfile compression/bigfile-gz1.gz compression/bigfile-xz9.xz compression/bigfile3 compression/bigfile4
Hãy lưu ý việc các tùy chọn được bắt đầu bằng -
. Không giống như hầu hết các chương trình, với tar
, -
không phải là bắt buộc khi chỉ định các tùy chọn, dù nếu được sử dụng thì nó cũng sẽ không gây ảnh hưởng gì.
Note
|
Bạn có thể sử dụng tùy chọn |
Bây giờ, hãy giải nén tệp:
$ cd ~/linux_essentials-3.1/archiving $ ls 3.1.tar $ tar xf 3.1.tar $ ls 3.1.tar compression
Giả sử bạn chỉ cần một tệp trong kho lưu trữ. Nếu đúng như vậy, bạn có thể chỉ định tệp đó sau tên tệp của kho lưu trữ. Bạn có thể chỉ định nhiều tệp nếu cần:
$ cd ~/linux_essentials-3.1/archiving $ rm -rf compression $ ls 3.1.tar $ tar xvf 3.1.tar compression/hosts.gz compression/ compression/bigfile-xz1.xz compression/bigfile-gz9.gz compression/hosts.gz compression/bigfile2 compression/bigfile compression/bigfile-gz1.gz compression/bigfile-xz9.xz compression/bigfile3 compression/bigfile4 $ ls 3.1.tar compression $ ls compression hosts.gz
Ngoại trừ các đường dẫn tuyệt đối (đường dẫn bắt đầu bằng /
), các tệp tar
sẽ bảo tồn toàn bộ đường dẫn tới các tệp khi chúng được tạo. Vì tệp 3.1.tar
được tạo với một thư mục duy nhất nên thư mục đó sẽ được tạo tương ứng với thư mục làm việc hiện tại của bạn khi được giải nén. Một ví dụ khác sẽ làm rõ việc này:
$ cd ~/linux_essentials-3.1/archiving $ rm -rf compression $ cd ../compression $ tar cf ../tar/3.1-nodir.tar * $ cd ../archiving $ mkdir untar $ cd untar $ tar -xf ../3.1-nodir.tar $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz
Tip
|
Nếu muốn sử dụng đường dẫn tuyệt đối trong tệp |
Chương trình tar
cũng có thể quản lý quá trình nén và giải nén tài liệu lưu trữ một cách nhanh chóng. tar
làm như vậy bằng cách gọi một trong các công cụ nén đã được nhắc đến ở trên. Việc này đơn giản là thêm một tùy chọn phù hợp với thuật toán nén. Những tuỳ chọn được sử dụng phổ biến nhất lần lượt là j
, J
và z
cho bzip2
, xz
và gzip
. Dưới đây là các ví dụ về việc sử dụng các thuật toán nói trên:
$ cd ~/linux_essentials-3.1/compression $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz $ tar -czf gzip.tar.gz bigfile bigfile2 bigfile3 $ tar -cjf bzip2.tar.bz2 bigfile bigfile2 bigfile3 $ tar -cJf xz.tar.xz bigfile bigfile2 bigfile3 $ ls -l | grep tar -rw-r--r-- 1 emma emma 450202 Jun 27 05:56 bzip2.tar.bz2 -rw-r--r-- 1 emma emma 548656 Jun 27 05:55 gzip.tar.gz -rw-r--r-- 1 emma emma 147068 Jun 27 05:56 xz.tar.xz
Hãy lưu ý rằng trong ví dụ này, các tệp .tar
có kích thước khác nhau. Điều này cho thấy chúng đã được nén thành công. Nếu bạn tạo các kho lưu trữ .tar
được nén, bạn phải luôn thêm phần mở rộng tệp thứ hai biểu thị thuật toán bạn đã sử dụng. Chúng lần lượt là .xz
, .bz
và .gz
cho xz
, bzip2
và gzip
. Đôi khi các phần mở rộng rút gọn như .tgz
sẽ được sử dụng.
Có thể thêm tệp vào kho lưu trữ tar chưa nén hiện có. Ta có thể sử dụng tùy chọn u
để thực hiện việc này. Nếu bạn cố gắng thêm vào một lưu trữ nén, bạn sẽ gặp lỗi.
$ cd ~/linux_essentials-3.1/compression $ ls bigfile bigfile3 bigfile-gz1.gz bigfile-xz1.xz bzip2.tar.bz2 hosts.gz bigfile2 bigfile4 bigfile-gz9.gz bigfile-xz9.xz gzip.tar.gz xz.tar.xz $ tar cf plain.tar bigfile bigfile2 bigfile3 $ tar tf plain.tar bigfile bigfile2 bigfile3 $ tar uf plain.tar bigfile4 $ tar tf plain.tar bigfile bigfile2 bigfile3 bigfile4 $ tar uzf gzip.tar.gz bigfile4 tar: Cannot update compressed archives Try 'tar --help' or 'tar --usage' for more information.
Quản lý tệp ZIP
Các máy Windows thường không có các ứng dụng để xử lý bóng tar hoặc nhiều công cụ nén thường thấy trên hệ thống Linux. Nếu bạn cần tương tác với các hệ thống Windows, bạn có thể sử dụng các tệp ZIP. Tệp ZIP là tệp lưu trữ tương tự như tệp tar
đã nén.
Các chương trình zip
và unzip
có thể được sử dụng để làm việc với các tệp ZIP trên hệ thống Linux. Ví dụ dưới đây là tất cả những gì bạn cần để bắt đầu sử dụng chúng. Trước tiên, chúng ta sẽ tạo một tập hợp các tệp:
$ cd ~/linux_essentials-3.1 $ mkdir zip $ cd zip/ $ mkdir dir $ touch dir/file1 dir/file2
Bây giờ chúng ta sử dụng zip
để đóng gói các tệp này thành tệp ZIP:
$ zip -r zipfile.zip dir adding: dir/ (stored 0%) adding: dir/file1 (stored 0%) adding: dir/file2 (stored 0%) $ rm -rf dir
Cuối cùng, ta giải nén lại tệp ZIP:
$ ls zipfile.zip $ unzip zipfile.zip Archive: zipfile.zip creating: dir/ extracting: dir/file1 extracting: dir/file2 $ find . ./zipfile.zip ./dir ./dir/file1 ./dir/file2
Khi thêm thư mục vào tệp ZIP, tùy chọn -r
sẽ khiến zip
bao gồm cả nội dung của thư mục. Không có nó, bạn sẽ có một thư mục trống trong tệp ZIP.
Bài tập Hướng dẫn
-
Hãy xét phần mở rộng và cho biết công cụ nào sau đây được sử dụng để tạo các tệp này?
Tên Tệp tar
gzip
bzip2
xz
archive.tar
archive.tgz
archive.tar.xz
-
Xét các phần mở rộng, tệp nào trong số này là tệp lưu trữ và tệp nào là tệp nén?
Tên tệp Tệp Lưu trữ Tệp Nén file.tar
file.tar.bz2
file.zip
file.xz
-
Làm cách nào để có thể thêm tệp vào tệp
tar
đã nén bằnggzip
? -
Tùy chọn nào của lệnh`tar` sẽ hướng dẫn
tar
bao gồm cả/
đứng đầu trong các đường dẫn tuyệt đối? -
zip
có hỗ trợ các mức nén khác nhau không?
Bài tập Mở rộng
-
Khi giải nén tệp,
tar
có hỗ trợ khối khớp mã trong danh sách tệp không? -
Làm cách nào để có thể đảm bảo tệp được giải nén sẽ giống với tệp trước khi được nén?
-
Điều gì sẽ xảy ra nếu bạn cố trích xuất một tệp từ kho lưu trữ
tar
đã tồn tại trên hệ thống tệp của bạn? -
Làm cách nào để có thể giải nén tệp
archive.tgz
mà không sử dụng tùy chọntar
z
?
Tóm tắt
Các hệ thống Linux có sẵn một số công cụ nén và lưu trữ. Bài học này đã cho chúng ta biết về những công cụ phổ biến nhất. Công cụ lưu trữ phổ biến nhất là tar
. Nếu cần tương tác với các hệ thống Windows, zip
và unzip
có thể tạo và giải nén các tệp ZIP.
Lệnh tar
có một vài tùy chọn đáng để ghi nhớ. Chúng là x
để giải nén, c
để tạo, t
để xem nội dung và u
để thêm hoặc thay thế tệp. Tùy chọn v
sẽ liệt kê các tệp được tar
xử lý trong khi tạo hoặc giải nén tệp lưu trữ.
Kho lưu trữ của bản phân phối Linux điển hình có nhiều công cụ nén. Phổ biến nhất là gzip
, bzip2
và xz
. Các thuật toán nén thường hỗ trợ các cấp độ nén khác nhau cho phép bạn tối ưu hóa tốc độ hoặc kích thước tệp. Các tệp có thể được giải nén bằng gunzip
, bunzip2
và unxz
.
Các công cụ nén thường có các chương trình hoạt động giống như các công cụ tệp văn bản phổ biến với sự khác biệt là chúng hoạt động trên các tệp nén. Một vài trong số đó là zcat
, bzcat
và xzcat
. Các công cụ nén thường đi kèm với các chương trình có chức năng của grep
, more
, less
, diff
và cmp
.
Các lệnh được dùng trong bài học này:
bunzip2
-
Giải nén tệp nén
bzip2
. bzcat
-
Xuất nội dung của tệp nén
bzip
. bzip2
-
Nén tệp bằng thuật toán và định dạng
bzip2
. gunzip
-
Giải nén tệp nén
gzip
. gzip
-
Nén tệp bằng thuật toán và định dạng
gzip
. tar
-
Tạo, cập nhật, liệt kê và trích xuất các kho lưu trữ
tar
. unxz
-
Giải nén tệp nén
xz
. unzip
-
Giải nén và trích xuất nội dung từ tệp ZIP.
xz
Nén tệp bằng thuật toán và định dạng xz
.
zcat
-
Xuất nội dung của tệp nén
gzip
. zip
-
Tạo và nén các tệp lưu trữ ZIP.
Đáp án Bài tập Hướng dẫn
-
Xét các phần mở rộng, tệp nào trong số này là tệp lưu trữ và tệp nào là tệp nén?
Tên tệp Tệp Lưu trữ Tệp Nén archive.tar
X
archive.tgz
X
X
archive.tar.xz
X
X
-
Xét các phần mở rộng, tệp nào trong số này là tệp lưu trữ và tệp nào là tệp nén?
Tên tệp Tệp Lưu trữ Tệp Nén file.tar
X
file.tar.bz2
X
X
file.zip
X
X
file.xz
X
-
Làm cách nào để có thể thêm tệp vào tệp
tar
đã nén bằnggzip
?Giải nén tệp bằng
gunzip
, thêm tệp bằngtar uf
, sau đó nén tệp bằnggzip
. -
Tùy chọn nào của lệnh`tar` sẽ hướng dẫn
tar
bao gồm cả/
đứng đầu trong các đường dẫn tuyệt đối?Tùy chọn
-P
. Từ trang hướng dẫn:-P, --absolute-names Don't strip leading slashes from file names when creating archives
-
zip
có hỗ trợ các mức nén khác nhau không?Có. Sử dụng
-#
, thay thế#
bằng một số từ 0-9. Từ trang hướng dẫn:-# (-0, -1, -2, -3, -4, -5, -6, -7, -8, -9) Regulate the speed of compression using the specified digit #, where -0 indicates no compression (store all files), -1 indi‐ cates the fastest compression speed (less compression) and -9 indicates the slowest compression speed (optimal compression, ignores the suffix list). The default compression level is -6. Though still being worked, the intention is this setting will control compression speed for all compression methods. Cur‐ rently only deflation is controlled.
Đáp án Bài tập Mở rộng
-
Khi giải nén tệp,
tar
có hỗ trợ khối khớp mã trong danh sách tệp không?Có, bằng cách sử dụng tùy chọn
--wildcards
.--wildcards
phải được đặt ngay sau tệptar
khi sử dụng kiểu tùy chọn không có dấu gạch ngang. Ví dụ:$ tar xf tarfile.tar --wildcards dir/file* $ tar --wildcards -xf tarfile.tar dir/file*
-
Làm cách nào để có thể đảm bảo tệp được giải nén sẽ giống với tệp trước khi được nén?
Bạn không cần phải làm bất cứ điều gì khi sử dụng các công cụ được đề cập đến trong bài học này. Cả ba đều bao gồm tổng kiểm tra ở định dạng tệp của chúng được xác minh khi chúng được giải nén.
-
Điều gì sẽ xảy ra nếu bạn cố trích xuất một tệp từ kho lưu trữ
tar
đã tồn tại trên hệ thống tệp của bạn?Tệp trên hệ thống tệp của bạn sẽ bị ghi đè bằng phiên bản có trong tệp
tar
. -
Làm cách nào để có thể giải nén tệp
archive.tgz
mà không sử dụng tùy chọntar
z
?Trước tiên, bạn sẽ giải nén nó bằng
gunzip
.$ gunzip archive.tgz $ tar xf archive.tar