23 ví dụ lệnh tar cho Linux

Tác giả sysadmin, T.M.Hai 27, 2022, 06:24:30 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 2 Khách đang xem chủ đề.

23 ví dụ lệnh tar cho Linux


Lệnh lưu trữ băng GNU, được gọi là 'tar', được sử dụng để lưu trữ nhiều tệp khác nhau cùng nhau thành một tệp lưu trữ duy nhất. Điều này giúp dễ dàng thực hiện sao lưu và khôi phục các tệp và thư mục trong các hệ điều hành dựa trên Unix/Linux.

Các ví dụ thực tế trong hướng dẫn này sẽ chỉ cho bạn cách sử dụng lệnh tar trong mọi tình huống khác nhau.

1. Tạo tệp Tar

Ở dạng đơn giản nhất, lệnh tar có thể được sử dụng để sao chép nhiều tệp vào một tệp.tar. Tùy chọn -c được sử dụng để tạo tệp lưu trữ mới, trong khi tùy chọn -f được sử dụng để chỉ định tệp lưu trữ sẽ sử dụng (trong trường hợp này là tạo).

Mã nguồn [Chọn]
[root@centos7 ~]# tar -cf archive.tar test1.txt test2.txt
[root@centos7 ~]# ls -la
-rw-r--r--.  1 root root      10240 Sep  2 12:26 archive.tar
-rw-r--r--.  1 root root         52 Sep  2 12:24 test1.txt
-rw-r--r--.  1 root root         18 Sep  2 09:42 test2.txt

Các tệp gốc vẫn tồn tại sau khi được thêm vào kho lưu trữ, chúng không bị xóa theo mặc định.

Lưu ý rằng chúng tôi không cần phần mở rộng.tar, tuy nhiên chúng tôi sử dụng nó ở đây để cho phép chúng tôi dễ dàng xem tệp là gì.

2. Liệt kê nội dung lưu trữ

Chúng ta có thể liệt kê nội dung trong tệp tar bằng tùy chọn -t. Lưu ý rằng chúng tôi cũng cần tùy chọn -f để chỉ định tệp tar sẽ chạy.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -tf archive.tar
test1.txt
test2.txt

3. Giải nén từ tệp Tar

Chúng tôi có thể trích xuất tất cả nội dung của tệp tar bằng tùy chọn -x. Trong ví dụ này, chúng tôi hiển thị nội dung của tệp test2.txt gốc, xóa sạch tệp, sau đó trích xuất nội dung của archive.tar để xác nhận rằng nội dung của test2.txt đã được trả lại từ bản sao trong kho lưu trữ.

Mã nguồn [Chọn]
[root@centos7 ~]# cat test2.txt
This is test2.txt
[root@centos7 ~]# > test2.txt
[root@centos7 ~]# cat test2.txt
[root@centos7 ~]# tar -xf archive.tar
[root@centos7 ~]# cat test2.txt
This is test2.txt

Thao tác này sẽ không xóa tệp.tar mà nó sẽ giữ nguyên vị trí sau khi giải nén các tệp từ tệp đó.

4. Giải nén tệp Tar vào thư mục cụ thể

Theo mặc định, tar sẽ trích xuất vào thư mục làm việc hiện tại, điều này có thể không phải lúc nào cũng như những gì chúng ta muốn. Thay vì đầu tiên cd vào thư mục đích, chúng ta có thể sử dụng tùy chọn -C sẽ thay đổi thành thư mục được chỉ định khi thực hiện trích xuất cho chúng ta.

Mã nguồn [Chọn]
[root@centos7 ~]# mkdir new
[root@centos7 ~]# tar -xf archive.tar -C new/
[root@centos7 ~]# ls -l new/
total 8
-rw-r--r--. 1 root root 52 Sep  2 12:24 test1.txt
-rw-r--r--. 1 root root 18 Sep  2 09:42 test2.txt

5. Trích xuất các tệp cụ thể từ tệp Tar

Thay vì trích xuất tất cả nội dung của tệp tar mặc định, chúng ta có thể chỉ định một tệp cụ thể để giải nén. Trong ví dụ này, trước tiên chúng tôi xóa các tệp mà chúng tôi đã trích xuất từ ví dụ trước, sau đó chỉ giải nén riêng tệp test2.txt mà thôi.

Mã nguồn [Chọn]
[root@centos7 ~]# rm -f new/*
[root@centos7 ~]# tar -xf archive.tar -C new/ test2.txt
[root@centos7 ~]# ls -l new/
total 4
-rw-r--r--. 1 root root 18 Sep  2 09:42 test2.txt

Chúng tôi cũng có thể giải nén nhiều tệp cùng một lúc theo cách này bằng cách thêm nhiều tệp hơn vào cuối lệnh.

6. Hiển thị thông tin chi tiết

Tùy chọn -v cho tiết có thể được thêm vào lệnh tar sẽ hiển thị thông tin bổ sung hữu ích có thể hữu ích khi khắc phục sự cố. Đầu ra chi tiết sẽ in các tệp và thư mục đang được thêm vào kho lưu trữ hoặc trích xuất từ kho lưu trữ.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -cvf archive.tar test1.txt test2.txt
test1.txt
test2.txt

Bằng cách này, chúng ta có thể thấy một cách trực quan những gì đã được thêm vào tệp tar mà không cần liệt kê nội dung với -t sau thực tế.

7. Xóa khỏi kho lưu trữ

Chúng tôi cũng có thể xóa các tệp từ bên trong tệp tar bằng tùy chọn --delete. Trong ví dụ dưới đây, chúng tôi xóa tệp test2.txt, sau đó liệt kê nội dung của tệp archive.tar hiện chỉ còn lại tệp test1.txt bên trong.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -f archive.tar --delete test2.txt
[root@centos7 ~]# tar -tf archive.tar
test1.txt

8. Thêm nhiều tệp vào tệp Tar

Chúng tôi có thể thêm các tệp bổ sung vào tệp tar hiện có bằng tùy chọn -r sẽ nối các tệp vào kho lưu trữ. Trong ví dụ này, chúng tôi thêm lại tệp test2.txt đã trích xuất trước đó vào kho lưu trữ.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -f archive.tar -r new/test2.txt
[root@centos7 ~]# tar -tf archive.tar
test1.txt
new/test2.txt

Lưu ý rằng điều này cũng đã sao chép đường dẫn thư mục, như được hiển thị trong đầu ra khi chúng tôi liệt kê nội dung của tệp tar. Bây giờ, ngay cả khi chúng tôi xóa hoàn toàn thư mục mới, khi chúng tôi trích xuất nội dung của archive.tar, thư mục sẽ được tạo lại từ kho lưu trữ.

Mã nguồn [Chọn]
[root@centos7 ~]# rm -rf new/
[root@centos7 ~]# tar -xf archive.tar
[root@centos7 ~]# ls -l new/
total 4
-rw-r--r--. 1 root root 18 Sep  2 09:42 test2.txt

9. Cập nhật tệp bên trong kho lưu trữ

Chúng tôi có thể cập nhật các tệp hiện có bên trong tệp tar với các tệp mới hơn trên hệ thống tệp bằng tùy chọn -u, nó sẽ chỉ nối các tệp mới hơn bản sao trong tệp lưu trữ.

Trong ví dụ này, chúng tôi thêm "văn bản mới" vào new/test2.txt và sau đó cập nhật tệp archive.tar bằng tệp mới này. Sau đó, chúng tôi xóa tệp new/test2.txt, giải nén và khôi phục tệp, sau đó ghi nội dung để cho thấy rằng bản sao từ kho lưu trữ thực sự đã được cập nhật.

Mã nguồn [Chọn]
[root@centos7 ~]# echo "new text" >> new/test2.txt
[root@centos7 ~]# tar -uf archive.tar new/test2.txt
[root@centos7 ~]# rm -f new/test2.txt
[root@centos7 ~]# tar -xf archive.tar
[root@centos7 ~]# cat new/test2.txt
This is test2.txt
new text

10. Kích hoạt tính năng nén lưu trữ

Mặc dù chúng tôi luôn có thể nén tệp tar sau khi nó được tạo, lệnh tar cung cấp các tùy chọn cho phép chúng tôi nén tệp lưu trữ trong quá trình tạo.

Chúng ta có thể sử dụng tùy chọn -j để nén bằng bzip2. Thao tác này sẽ đặt tiện ích mở rộng lưu trữ thành.tar.bz2, khi tôi chạy lệnh lần đầu tiên, tôi gặp lỗi dưới đây:

Mã nguồn [Chọn]
tar (child): bzip2: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

Điều này là do gói bzip2 chưa được cài đặt trên hệ thống của tôi, sau khi được cài đặt với 'yum install bzip2', nó hoạt động bình thường.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -cjf archive.tar.bz2 test1.txt test2.txt
Chúng ta có thể sử dụng tùy chọn -J để nén bằng xz. Thao tác này sẽ đặt phần mở rộng lưu trữ thành.tar.xz

Mã nguồn [Chọn]
[root@centos7 ~]# tar -cJf archive.tar.xz test1.txt test2.txt
Chúng ta có thể sử dụng tùy chọn -z để nén bằng gzip, đây dường như là phương pháp nén phổ biến nhất được sử dụng với tar. Thao tác này sẽ đặt phần mở rộng lưu trữ thành.tar.gz

Mã nguồn [Chọn]
[root@centos7 ~]# tar -czf archive.tar.gz test1.txt test2.txt
Chúng ta có thể thấy rằng các phiên bản nén của archive.tar nhỏ hơn rất nhiều so với tệp tar gốc, mặc dù chứa cùng một nội dung.

Mã nguồn [Chọn]
[root@centos7 ~]# ls -la archive.tar*
-rw-r--r--. 1 root root 10240 Sep  2 12:45 archive.tar
-rw-r--r--. 1 root root   201 Sep  2 12:49 archive.tar.bz2
-rw-r--r--. 1 root root   190 Sep  2 12:47 archive.tar.gz
-rw-r--r--. 1 root root   244 Sep  2 12:47 archive.tar.xz

Trước đây, chúng tôi đã điều tra sự khác biệt về hiệu suất của các phương pháp nén này nếu bạn muốn xem phương pháp nào phù hợp nhất với mình, việc nén các tệp văn bản nhỏ này không phải là một ví dụ hay để xác định đâu là phương pháp nén tốt nhất, nói chung xz sẽ nén tốt hơn bzip2, sẽ nén tốt hơn gzip.

Chúng tôi có thể giải nén từ các tệp lưu trữ nén mà không chỉ định tùy chọn được sử dụng để nén chúng, tar đủ thông minh để tự giải quyết vấn đề này, vì vậy lệnh bên dưới hoàn toàn hợp lệ và sẽ trích xuất nội dung của tệp lưu trữ nén này.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -xf archive.tar.gz
Điều quan trọng cần lưu ý là chúng tôi không thể thêm các tệp bổ sung vào tệp tar đã nén, trước tiên chúng cần được giải nén, cập nhật, sau đó nén lại theo cách thủ công bằng các lệnh gzip, bzip2 hoặc xz.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -uf archive.tar.gz new/test2.txt
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

11. Tạo kho lưu trữ thư mục

Chúng tôi không chỉ phải thêm các tệp riêng lẻ vào tệp tar, chúng tôi có thể lưu trữ toàn bộ thư mục theo cách đệ quy để lưu trữ tất cả nội dung. Trong ví dụ này, chúng tôi sao chép tất cả nội dung của thư mục /etc/ sang etc.tar.gz, sau đó chúng tôi liệt kê các nội dung cho thấy việc này đã thành công.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -czf etc.tar.gz /etc/
tar: Removing leading `/' from member names
[root@centos7 ~]# ls -l etc.tar.gz
-rw-r--r--. 1 root root 7092784 Sep  2 12:56 etc.tar.gz
[root@centos7 ~]# tar -tf etc.tar.gz | head
etc/
etc/crypttab
etc/mtab
etc/resolv.conf
etc/pki/
etc/pki/rpm-gpg/
etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

Theo mặc định, tar chạy với tùy chọn --recursion, tùy chọn này sẽ lặp lại vào các thư mục con và cũng lưu trữ nội dung bên trong.

12. Vô hiệu hóa đệ quy thư mục

Như đã trình bày trong ví dụ trước khi chúng tôi lưu trữ một thư mục, các thư mục con và nội dung bên trong cũng được lưu trữ theo mặc định. Chúng ta có thể tùy chọn vô hiệu hóa đệ quy thư mục bằng tùy chọn --no-recursion, tùy chọn này sẽ tránh tự động đi xuống các thư mục khác.

Ví dụ này giống như ví dụ trước, tuy nhiên chúng ta có thể thấy trong kết quả đầu ra có các thư mục con được liệt kê tuy nhiên không có nội dung nào bên trong chúng được lưu trữ vì chúng ta chỉ nén các tệp trong thư mục được chỉ định mà không có đệ quy.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -czf etc-no-dirs.tar.gz /etc/* --no-recursion
tar: Removing leading `/' from member names
[root@centos7 ~]# tar -tf etc-no-dirs.tar.gz | head
etc/adjtime
etc/aliases
etc/aliases.db
etc/alternatives/
etc/anacrontab
etc/asound.conf
etc/audisp/
etc/audit/
etc/avahi/
etc/bash_completion.d/

13. Sự khác biệt giữa Lưu trữ và Hệ thống tệp

Chúng tôi có thể sử dụng tùy chọn -d hoặc --diff để thông báo cho chúng tôi nếu có bất kỳ sự khác biệt nào giữa tệp trong kho lưu trữ so với tệp trên hệ thống tệp. Trong ví dụ này, chúng tôi chỉnh sửa tệp test2.txt và sau đó thực hiện so sánh, vì chúng tôi có thể thấy nó báo cáo rằng thời gian sửa đổi và kích thước tệp khác nhau. Khi chúng tôi chạy tương tự với test1.txt chưa được thay đổi, chúng tôi không nhận được kết quả nào vì không có sự khác biệt.

Mã nguồn [Chọn]
[root@centos7 ~]# echo "change" >> test2.txt
[root@centos7 ~]# cat test2.txt
This is test2.txt
change
[root@centos7 ~]# tar -df archive.tar test2.txt
test2.txt: Mod time differs
test2.txt: Size differs
[root@centos7 ~]# tar -df archive.tar test1.txt
[root@centos7 ~]#

14. Giữ các tệp mới hơn

Khi giải nén, chúng tôi có thể không muốn thay thế các tệp trên hệ thống tệp mới hơn các tệp được lưu trữ trong kho lưu trữ tệp tar (hành động mặc định). Chúng tôi có thể chỉ định --keep-newer-files để đảm bảo rằng các tệp mới hơn này không bị ghi đè bằng các bản sao cũ hơn từ kho lưu trữ.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -xf archive.tar test2.txt --keep-newer-files
tar: Current `test2.txt' is newer or same age

Tệp test2.txt chưa được sửa đổi vì tệp trên hệ thống tệp của chúng tôi đã bị thay đổi sau khi được thêm vào kho lưu trữ.

15. Xóa tệp sau khi lưu trữ

Theo mặc định, khi chúng tôi thêm tệp vào tệp lưu trữ, tệp gốc sẽ vẫn còn trên hệ thống tệp. Chúng ta có thể tùy ý loại bỏ các file gốc sau khi thêm vào file tar bằng tùy chọn --remove-files. Mặc dù điều này sẽ xóa các tệp gốc khỏi hệ thống tệp, nhưng chúng sẽ tồn tại trong tệp tar.

Mã nguồn [Chọn]
[root@centos7 ~]# tar -cvf archive.tar test1.txt test2.txt --remove-files
16. Loại trừ tệp theo mẫu

Chúng tôi có thể loại trừ việc thêm các mục vào kho lưu trữ bằng tùy chọn --exclude theo sau là một mẫu được chỉ định. Trong ví dụ dưới đây, chúng ta có thể thấy chúng ta có hai tệp.txt và một tệp.mp3, chúng tôi không muốn đưa tệp mp3 vào kho lưu trữ của mình nên chúng tôi loại trừ tệp đó.

Mã nguồn [Chọn]
[root@centos7 new]# ls -l
total 3336
-rw-r--r--. 1 root root      52 Sep  2 12:24 test1.txt
-rw-r--r--. 1 root root      25 Sep  2 14:02 test2.txt
-rw-r--r--. 1 root root 3407872 Sep  2 14:35 z.mp3
[root@centos7 new]# tar -cvf exclude.tar --exclude=*.mp3 *
test1.txt
test2.txt

17. Xác nhận trước khi thêm tệp

Theo mặc định, tất cả các tệp được chỉ định sẽ tự động được thêm vào kho lưu trữ mà không cần xác nhận thêm. Chúng tôi có thể tùy ý chỉ định tùy chọn -w sẽ nhắc chúng tôi xác nhận đầu vào có hoặc không cho mọi tệp. Trong ví dụ dưới đây, chúng tôi nhập không cho test1.txt, sau đó xác nhận rằng nó thực sự đã bị loại khỏi tệp tar.

Mã nguồn [Chọn]
[root@centos7 new]# tar -cwf confirm.tar *
add `test1.txt'?n
add `test2.txt'?y
add `z.mp3'?y

[root@centos7 new]# tar -tf confirm.tar
test2.txt
z.mp3

Điều này cũng hoạt động khi giải nén tệp từ kho lưu trữ.

Mã nguồn [Chọn]
[root@centos7 new]# tar -xwf confirm.tar
extract `test2.txt'?n
extract `z.mp3'?y

18. Hỗ trợ POSIX ACL

Hỗ trợ POSIX ACL cho các tệp trong kho lưu trữ có thể được bật bằng tùy chọn --acls hoặc bị tắt bằng tùy chọn --no-acls, --no-acls được sử dụng theo mặc định, vì vậy nếu chúng tôi muốn hỗ trợ ACL thì nó phải được chỉ định.

Trong ví dụ này, chúng tôi sử dụng lệnh setfacl để đặt ACL cơ bản cho người dùng1 trên test1.txt, sau đó chúng tôi tạo một tệp tar chứa tệp này với --acls. Sau khi xóa tệp test1.txt ban đầu, chúng tôi giải nén tệp đó và chạy getfacl và xác nhận rằng ACL mà chúng tôi đã thêm vẫn còn đó.

Mã nguồn [Chọn]
[root@centos7 new]# setfacl -m u:user1:rw test1.txt
[root@centos7 new]# getfacl test1.txt
# file: test1.txt
# owner: root
# group: root
user::rw-
user:user1:rw-
group::r--
mask::rw-
other::r--

[root@centos7 new]# tar -cf acls.tar test1.txt --acls
[root@centos7 new]# rm -f test1.txt
[root@centos7 new]# tar -xf acls.tar
[root@centos7 new]# getfacl test1.txt
# file: test1.txt
# owner: root
# group: root
user::rw-
user:user1:rw-
group::r--
mask::rw-
other::r--

Như chúng ta có thể thấy khi sử dụng --acls, tệp được trích xuất và ACL tùy chỉnh cho người dùng 1 vẫn tồn tại. Bây giờ chúng tôi sẽ xóa tệp và xuất lại test1.txt từ tệp tar mà không cần --acls và chúng tôi sẽ thấy rằng ACL không còn xuất hiện trên tệp nữa.

Mã nguồn [Chọn]
[root@centos7 new]# rm -f test1.txt
[root@centos7 new]# tar -xf acls.tar
[root@centos7 new]# getfacl test1.txt
# file: test1.txt
# owner: root
# group: root
user::rw-
group::rw-
other::r--

19. Hỗ trợ thuộc tính mở rộng

Có thể bật hỗ trợ Thuộc tính mở rộng cho các tệp trong kho lưu trữ bằng tùy chọn --xattrs hoặc tắt bằng tùy chọn --no-xattrs.

Mã nguồn [Chọn]
[root@centos7 new]# tar -cf xattrs.tar test1.txt --xattrs
20. Hỗ trợ SELinux

Hỗ trợ SELinux cho các tệp trong kho lưu trữ có thể được bật bằng tùy chọn --selinux hoặc tắt bằng tùy chọn --no-selinux.

Mã nguồn [Chọn]
[root@centos7 new]# tar -cf no-selinux.tar * --no-selinux
21. Đặt Người dùng/Nhóm Chủ sở hữu Mới của Tệp Lưu trữ

Chúng tôi có thể đặt người dùng và/hoặc chủ sở hữu nhóm của tệp khi thêm tệp đó vào kho lưu trữ với --owner=name để buộc chủ sở hữu mới và --group=name để buộc một nhóm mới cho các tệp đã thêm.

Mã nguồn [Chọn]
[root@centos7 new]# tar -cf user-group-change.tar test2.txt --owner=user1 --group=user1
Bây giờ, khi chúng tôi giải nén tệp này, người dùng và nhóm sẽ được đặt thành user1, thay vì root.

Mã nguồn [Chọn]
[root@centos7 new]# tar -xf user-group-change.tar
[root@centos7 new]# ls -l
total 3364
-rw-rw-r--. 1 root  root       52 Sep  2 12:24 test1.txt
-rw-r--r--. 1 user1 user1      25 Sep  2 14:02 test2.txt

22. Giải nén tập tin thành đầu ra tiêu chuẩn

Thay vì trích xuất các tệp từ bên trong tệp tar sang hệ thống tệp, chúng ta có thể chỉ cần gửi chúng đến thiết bị xuất chuẩn thay vì tùy chọn -O có thể hữu ích nếu chúng ta chỉ muốn đọc nhanh nội dung của tệp mà không cần phải giải nén tệp đó trước.

Mã nguồn [Chọn]
[root@centos7 new]# tar -xOf archive.tar test1.txt
This is test1.txt
[root@centos7 new]# tar -xOf archive.tar test2.txt
This is test2.txt

23. Kiểm tra tệp lưu trữ

Chúng tôi có thể cố gắng xác minh tệp lưu trữ trong khi tạo bằng tùy chọn -W.

Mã nguồn [Chọn]
[root@centos7 new]# tar -cvWf archive.tar test1.txt test2.txt
test1.txt
test2.txt
Verify test1.txt
Verify test2.txt

Như chúng ta đã thấy lệnh tar có thể được sử dụng để dễ dàng lưu trữ các tệp khác nhau vào một tệp lưu trữ duy nhất. Khi được kết hợp với nhiều tùy chọn có sẵn, chúng tôi có thể thực hiện các tác vụ mạnh mẽ cho phép chúng tôi sao lưu và khôi phục các tệp và thư mục.