103.3 Bài 2
Chứng chỉ: |
LPIC-1 |
---|---|
Phiên bản: |
5.0 |
Chủ đề: |
103 Lệnh GNU và Unix |
Mục tiêu: |
103.3 Thực hiện Quản lý Tệp cơ bản |
Bài: |
2 trên 2 |
Giới thiệu
Cách tìm Tệp
Khi chúng ta sử dụng máy, các tệp sẽ tăng dần về số lượng và kích thước khiến việc định vị một tệp cụ thể đôi khi trở nên khó khăn hơn. May mắn thay, Linux có lệnh find
cho phép chúng ta nhanh chóng tìm kiếm và định vị các tệp. Lệnh find
sử dụng cú pháp như sau:
find STARTING_PATH OPTIONS EXPRESSION
STARTING_PATH
(Đường dẫn bắt đầu)-
xác định thư mục bắt đầu tìm kiếm.
OPTIONS
(Tuỳ chọn)-
kiểm soát hành vi và thêm các tiêu chí cụ thể để tối ưu hóa quá trình tìm kiếm.
EXPRESSION
(Biểu thức)-
xác định truy vấn tìm kiếm.
$ find . -name "myfile.txt" ./myfile.txt
Đường dẫn bắt đầu trong trường hợp này là thư mục hiện tại. Tùy chọn -name
đã chỉ định rằng phiên tìm kiếm sẽ dựa trên tên của tệp. myfile.txt
là tên của tệp cần tìm kiếm. Khi sử dụng tính năng khớp mã khối tệp, hãy đảm bảo biểu thức được nằm trong dấu trích dẫn kép:
$ find /home/frank -name "*.png" /home/frank/Pictures/logo.png /home/frank/screenshot.png
Lệnh này sẽ tìm tất cả các tệp kết thúc bằng .png
bắt đầu từ thư mục /home/frank/
trở xuống. Nếu chưa hiểu về cách sử dụng ký tự đại diện dấu hoa thị (*
), hãy xem lại bài học trước.
Sử dụng tiêu chí để tăng tốc độ tìm kiếm
Chúng ta có thể sử dụng find
để định vị tệp dựa trên loại, kích thước hoặc thời gian. Bằng cách chỉ định một hoặc nhiều tùy chọn, chúng ta sẽ thu được kết quả mong muốn trong một khoảng thời gian ngắn hơn.
Các khoá chuyển để tìm tệp dựa trên loại bao gồm:
-type f
-
tìm kiếm tệp.
-type d
-
tìm kiếm thư mục.
-type l
-
tìm kiếm liên kết tượng trưng.
$ find . -type d -name "example"
Lệnh này sẽ tìm tất cả các thư mục trong thư mục hiện tại và ở dưới có tên example
.
Các tiêu chí khác có thể được sử dụng với find
bao gồm:
-name
-
thực hiện tìm kiếm dựa trên tên đã cho.
-iname
-
tìm kiếm dựa trên tên nhưng không phân biệt chữ hoa và chữ thường (nghĩa là trường hợp của
myFile
cũng sẽ tương tự nhưMYFILE
). -not
-
trả về những kết quả không khớp với trường hợp thử nghiệm.
-maxdepth N
-
tìm kiếm trong thư mục hiện tại cũng như các thư mục con ở cấp độ
N
sâu.
Định vị Tệp theo thời gian sửa đổi
find
cũng cho phép chúng ta lọc phân cấp thư mục dựa trên thời điểm tệp được sửa đổi:
$ sudo find / -name "*.conf" -mtime 7 /etc/logrotate.conf
Lệnh này sẽ tìm kiếm tất cả các tệp trong toàn bộ hệ thống tệp (đường dẫn bắt đầu sẽ là thư mục gốc, tức /
) được kết thúc bằng các ký tự .conf
và đã được sửa đổi trong bảy ngày qua. Lệnh này sẽ yêu cầu các đặc quyền nâng cao để truy cập các thư mục bắt đầu từ cơ sở cấu trúc thư mục của hệ thống (vì thế nên phải sử dụng sudo
ở đây). Đối số được truyền đến mtime
biểu thị số ngày kể từ khi tệp được sửa đổi lần cuối.
Định vị Tệp theo kích thước
find
cũng có thể định vị tệp theo kích thước. Ví dụ: để tìm kiếm các tệp lớn hơn 2G
trong /var
:
$ sudo find /var -size +2G /var/lib/libvirt/images/debian10.qcow2 /var/lib/libvirt/images/rhel8.qcow2
Tùy chọn -size
sẽ hiển thị các tệp có kích thước tương ứng với đối số được truyền. Một số đối số ví dụ bao gồm:
-size 100b
-
tệp có kích cỡ chính xác là 100 byte.
-size +100k
-
tệp có kích cỡ lớn hơn 100 kilobyte.
-size -20M
-
tệp có kích cỡ nhỏ hơn 20 megabyte.
-size +2G
-
tệp có kích cỡ lớn hơn 2 gigabyte.
Note
|
Để tìm các tệp trống, chúng ta có thể sử dụng: |
Thao tác trên Tập kết quả
Sau khi phiên tìm kiếm hoàn thành, ta có thể thực hiện một hành động trên tập hợp kết quả bằng cách sử dụng -exec
:
$ find . -name "*.conf" -exec chmod 644 '{}' \;
Lệnh này sẽ lọc mọi đối tượng bên trong thư mục hiện tại (.
) và theo xuống dưới để tìm tên tệp kết thúc bằng .conf
, sau đó thực thi lệnh chmod 644
để sửa đổi quyền truy cập tệp trên kết quả.
Hiện tại, bạn không cần bận tâm đến ý nghĩa của '{}' \;
vì nó sẽ được thảo luận sau.
Sử dụng grep
để lọc Tệp dựa trên nội dung
grep
được sử dụng để tìm kiếm sự xuất hiện của một từ khóa.
Hãy xem một tình huống mà chúng ta tìm tệp dựa trên nội dung:
$ find . -type f -exec grep "lpi" '{}' \; -print ./.bash_history Alpine/M helping/M
Lệnh này sẽ tìm kiếm mọi đối tượng trong hệ thống phân cấp thư mục hiện tại (.
) là một tệp (-type f
) và sau đó thực thi lệnh grep "lpi"
cho mọi tệp thỏa mãn các điều kiện. Các tệp phù hợp với các điều kiện này sẽ được in trên màn hình (-print
). Dấu ngoặc nhọn ({}
) là phần giữ chỗ cho kết quả trùng khớp với find
. {}
được đặt trong dấu trích dẫn đơn ('
) để tránh truyền các tệp grep
có tên chứa các ký tự đặc biệt. Lệnh -exec
sẽ được kết thúc bằng dấu chấm phẩy (;
). Dấu chấm phẩy này phải được thoát (\;
) để tránh bị thông dịch bởi vỏ.
Việc thêm tùy chọn -delete
vào cuối biểu thức sẽ xóa tất cả các tệp khớp. Tùy chọn này chỉ nên được sử dụng khi người dùng chắc chắn rằng kết quả sẽ chỉ khớp với các tệp mà mình muốn xóa.
Trong ví dụ bên dưới, find
sẽ định vị tất cả các tệp trong hệ thống phân cấp bắt đầu từ thư mục hiện tại, sau đó xóa tất cả các tệp kết thúc bằng ký tự .bak
:
$ find . -name "*.bak" -delete
Lưu trữ Tệp
Lệnh tar
(Lưu trữ và Nén)
Lệnh tar
(viết tắt của “tape archive(r)” - lưu trữ dạng băng) được sử dụng để tạo các kho lưu trữ tar bằng cách chuyển đổi một nhóm tệp thành một kho lưu trữ. Các kho lưu trữ được tạo để dễ dàng di chuyển hoặc sao lưu một nhóm tệp. Hãy coi tar
giống như một công cụ tạo ra chất keo kết dính hoặc nhóm các tệp lại với nhau để có thể di chuyển dễ dàng.
tar
cũng có khả năng trích xuất kho lưu trữ tar, hiển thị danh sách các tệp có trong kho lưu trữ cũng như thêm các tệp bổ sung vào kho lưu trữ hiện có.
Cú pháp lệnh tar
sẽ như sau:
tar [OPERATION_AND_OPTIONS] [ARCHIVE_NAME] [FILE_NAME(S)]
OPERATION
-
Chỉ cho phép và yêu cầu một đối số hoạt động duy nhất. Các hoạt động được sử dụng thường xuyên nhất là:
--create
(-c
)-
Tạo một kho lưu trữ tar mới.
--extract
(-x
)-
Trích xuất toàn bộ kho lưu trữ hoặc một hoặc nhiều tệp từ một kho lưu trữ.
--list
(-t
)-
Hiển thị danh sách các tệp có trong kho lưu trữ.
OPTION
-
Các tùy chọn được sử dụng thường xuyên nhất là:
--verbose
(-v
)-
Hiển thị các tệp đang được xử lý bởi lệnh
tar
. --file=archive-name
(-f archive-name
)-
Chỉ định tên tệp lưu trữ.
ARCHIVE_NAME
-
Tên của kho lưu trữ.
FILE_NAME(S)
-
Danh sách tên tệp được phân tách bằng dấu cách. Nếu không được cung cấp, toàn bộ kho lưu trữ sẽ được trích xuất.
Tạo Kho Lưu trữ
Giả sử chúng ta có một thư mục có tên là stuff
nằm trong thư mục hiện tại và muốn lưu nó vào một tệp có tên archive.tar
. Chúng ta có thể chạy lệnh sau:
$ tar -cvf archive.tar stuff stuff/ stuff/service.conf
Sau đây là ý nghĩa thực sự của những khoá chuyển trên:
-c
-
Tạo một kho lưu trữ.
-v
-
Hiển thị tiến trình trong cửa sổ dòng lệnh trong khi tạo kho lưu trữ, còn được gọi là chế độ “verbose”.
-v
không phải là tuỳ chọn bắt buộc đối với các lệnh này nhưng nó lại rất hữu ích. -f
-
Cho phép chỉ định tên tệp của kho lưu trữ.
Nói chung, để lưu trữ một thư mục hoặc một tệp trên Linux, chúng ta sử dụng:
tar -cvf NAME-OF-ARCHIVE.tar /PATH/TO/DIRECTORY-OR-FILE
Note
|
|
Để lưu trữ nhiều thư mục cùng một lúc, chúng ta sẽ liệt kê tất cả các thư mục và phân định chúng bằng khoảng trắng trong phần /PATH/TO/DIRECTORY-OR-FILE
:
$ tar -cvf archive.tar stuff1 stuff2
Điều này sẽ tạo ra kho lưu trữ stuff1
và stuff2
trong archive.tar
Giải nén một Kho Lưu trữ
Chúng ta có thể giải nén một kho lưu trữ bằng cách sử dụng tar
:
$ tar -xvf archive.tar stuff/ stuff/service.conf
Lệnh này sẽ giải nén nội dung của archive.tar
vào thư mục hiện tại.
Lệnh này giống như lệnh tạo kho lưu trữ được sử dụng ở trên, ngoại trừ việc khóa chuyển -x
sẽ thay thế khóa chuyển -c
.
Để giải nén nội dung của kho lưu trữ vào một thư mục cụ thể, chúng ta sẽ sử dụng -C
:
$ tar -xvf archive.tar -C /tmp
Lệnh này sẽ giải nén nội dung của archive.tar
vào thư mục hiện tại.
$ ls /tmp stuff
Nén bằng tar
Lệnh GNU tar
đi kèm với các bản phân phối Linux có thể tạo một kho lưu trữ .tar
và sau đó nén nó bằng cách nén gzip
hoặc bzip2
trong một lệnh duy nhất:
$ tar -czvf name-of-archive.tar.gz stuff
Lệnh này sẽ tạo một tệp nén bằng thuật toán gzip
(-z
).
Mặc dù tính năng nén gzip
được sử dụng thường xuyên nhất để tạo các tệp .tar.gz
hoặc .tgz
, tar
cũng hỗ trợ cả tính năng nén bzip2
. Điều này cho phép ta tạo các tệp nén bzip2
thường được đặt tên là .tar.bz2
, .tar.bz
hoặc .tbz
.
Để làm như vậy, chúng ta sẽ thay thế -z
cho gzip
bằng -j
cho bzip2
:
$ tar -cjvf name-of-archive.tar.bz stuff
Để giải nén tệp, chúng ta sẽ thay thế -c
bằng -x
(viết tắt của “extract”):
$ tar -xzvf archive.tar.gz
gzip
nhanh hơn nhưng nó thường sẽ nén ít hơn và vì vậy nên tệp nén sẽ lớn hơn một chút. bzip2
chậm hơn nhưng nén nhiều hơn nên tệp nén sẽ nhỏ hơn. Tuy nhiên, gzip
và bzip2
nhìn chung trên thực tế là giống nhau và cũng hoạt động tương tự như nhau.
Ngoài ra, chúng ta có thể áp dụng nén gzip
hoặc bzip2
bằng cách sử dụng lệnh gzip
để nén gzip
và lệnh bzip
để nén bzip
. Ví dụ: để áp dụng nén gzip
, hãy sử dụng:
gzip FILE-TO-COMPRESS
gzip
-
tạo tệp nén có cùng tên nhưng có đuôi
.gz
. gzip
-
xóa các tệp gốc sau khi tạo tệp nén.
Lệnh bzip2
cũng hoạt động theo cách tương tự.
Để giải nén các tệp, chúng ta có thể sử dụng gunzip
hoặc bunzip2
tùy thuộc vào thuật toán được sử dụng để nén tệp.
Lệnh cpio
cpio
là viết tắt của “copy in, copy out” (sao chép vào, sao chép ra). Nó được sử dụng để xử lý các tệp lưu trữ như *.cpio
hoặc *.tar
.
cpio
thực hiện các thao tác sau:
-
Sao chép tệp vào một kho lưu trữ.
-
Trích xuất tệp từ một kho lưu trữ.
Nó sẽ lấy danh sách các tệp từ đầu vào tiêu chuẩn (hầu hết là đầu ra từ ls
).
Để tạo kho lưu trữ cpio
, chúng ta sử dụng:
$ ls | cpio -o > archive.cpio
Tùy chọn -o
sẽ hướng dẫn cpio
tạo đầu ra. Trong trường hợp này, tệp đầu ra được tạo là archive.cpio
. Lệnh ls
sẽ liệt kê nội dung của thư mục hiện tại sắp được lưu trữ.
Để trích xuất kho lưu trữ, chúng ta sử dụng:
$ cpio -id < archive.cpio
Tùy chọn -i
được sử dụng để thực hiện giải nén. Tùy chọn -d
sẽ tạo thư mục đích. Ký tự <
đại diện cho đầu vào tiêu chuẩn. Tệp đầu vào được giải nén sẽ là archive.cpio
.
Lệnh dd
dd
sẽ sao chép dữ liệu từ vị trí này sang vị trí khác. Cú pháp dòng lệnh của dd
khác với nhiều chương trình Unix khác. Nó sử dụng cú pháp option=value
cho các tùy chọn dòng lệnh thay vì các định dạng -option value
hoặc --option=value
của tiêu chuẩn GNU:
$ dd if=oldfile of=newfile
Lệnh này sẽ sao chép nội dung của oldfile
vào newfile
, trong đó, if=
là tệp đầu vào và of=
là tệp đầu ra.
Note
|
Lệnh |
dd
cũng được sử dụng để thay đổi dữ liệu thành chữ hoa/chữ thường hoặc ghi trực tiếp vào các thiết bị khối như /dev/sdb
:
$ dd if=oldfile of=newfile conv=ucase
Lệnh này sẽ sao chép tất cả nội dung của oldfile
vào newfile
và viết hoa toàn bộ văn bản.
Lệnh sau sẽ sao lưu toàn bộ ổ cứng nằm tại /dev/sda
vào một tệp có tên backup.dd
:
$ dd if=/dev/sda of=backup.dd bs=4096
Bài tập Hướng dẫn
-
Hãy xem danh sách sau:
$ find /home/frank/Documents/ -type d /home/frank/Documents/ /home/frank/Documents/animal /home/frank/Documents/animal/domestic /home/frank/Documents/animal/wild
-
Lệnh này sẽ xuất ra loại tệp nào?
-
Việc tìm kiếm sẽ bắt đầu từ thư mục nào?
-
-
Một người dùng muốn nén thư mục sao lưu của mình. Anh ta sử dụng lệnh sau:
$ * tar cvf /home/frank/backup.tar.gz /home/frank/dir1*
Tùy chọn nào đang bị thiếu để có thể nén bản sao lưu bằng thuật toán
gzip
?
Bài tập Mở rộng
-
Là quản trị viên hệ thống, bạn cần phải thực hiện việc kiểm tra thường xuyên để xóa các tệp có dung lượng lớn. Các tệp đồ sộ này nằm trong
/var
và kết thúc bằng phần mở rộng.backup
.-
Hãy viết lệnh sử dụng
find
để định vị các tệp này: -
Một phân tích về kích thước của các tệp này cho thấy chúng có phạm vi từ
100M
đến1000M
. Hãy hoàn thành lệnh trên với thông tin mới này để có thể định vị các tệp sao lưu từ100M
đến1000M
: -
Cuối cùng, hãy hoàn thành lệnh này với hành động xóa để các tệp này sẽ bị xóa:
-
-
Trong thư mục
/var
có tồn tại bốn tệp sao lưu sau:db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Bằng cách sử dụng
tar
, hãy chỉ định lệnh sẽ tạo tệp lưu trữ có têndb-first-quý-2018.backup.tar
: -
Bằng cách sử dụng
tar
, hãy chỉ định lệnh sẽ tạo kho lưu trữ và nén nó bằnggzip
. Hãy lưu ý rằng tên tệp kết quả phải kết thúc bằng.gz
:
-
Tóm tắt
Trong bài học này, chúng ta đã học về:
-
Cách tìm tệp bằng
find
. -
Cách thêm tiêu chí tìm kiếm dựa trên thời gian, loại tệp hoặc kích thước bằng cách cung cấp đối số cho
find
. -
Làm thế nào để thao tác trên một tập hợp kết quả.
-
Cách lưu trữ, nén và giải nén tệp bằng
tar
. -
Xử lý kho lưu trữ với
cpio
. -
Sao chép tệp với
dd
.
Đáp án Bài tập Hướng dẫn
-
Hãy xem phần liệt kê sau:
$ find /home/frank/Documents/ -type d /home/frank/Documents/ /home/frank/Documents/animal /home/frank/Documents/animal/domestic /home/frank/Documents/animal/wild
-
Lệnh này sẽ xuất ra loại tệp nào?
Các thư mục.
-
Việc tìm kiếm sẽ bắt đầu từ thư mục nào?
/home/frank/Documents
-
-
Một người dùng muốn nén thư mục sao lưu của mình. Anh ta sử dụng lệnh sau:
$ * tar cvf /home/frank/backup.tar.gz /home/frank/dir1*
Tùy chọn nào đang bị thiếu để có thể nén bản sao lưu bằng thuật toán
gzip
?Tuỳ chọn
-z
.
Đáp án Bài tập Mở rộng
-
Là quản trị viên hệ thống, bạn cần phải thực hiện việc kiểm tra thường xuyên để xóa các tệp có dung lượng lớn. Các tệp đồ sộ này nằm trong
/var
và kết thúc bằng phần mở rộng.backup
.-
Hãy viết lệnh sử dụng
find
để định vị các tệp này:$ find /var -name *.backup
-
Một phân tích về kích thước của các tệp này cho thấy chúng có phạm vi từ
100M
đến1000M
. Hãy hoàn thành lệnh trên với thông tin mới này để có thể định vị các tệp sao lưu từ100M
đến1000M
:$ find /var -name *.backup -size +100M -size -1000M
-
Cuối cùng, hãy hoàn thành lệnh này với hành động xóa để các tệp này sẽ bị xóa:
$ find /var -name *.backup -size +100M -size -1000M -delete
-
-
Trong thư mục
/var
có tồn tại bốn tệp sao lưu sau:db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Bằng cách sử dụng
tar
, hãy chỉ định lệnh sẽ tạo tệp lưu trữ có têndb-first-quý-2018.backup.tar
:$ tar -cvf db-first-quarter-2018.backup.tar db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
Bằng cách sử dụng
tar
, hãy chỉ định lệnh sẽ tạo kho lưu trữ và nén nó bằnggzip
. Hãy lưu ý rằng tên tệp kết quả phải kết thúc bằng.gz
:$ tar -zcvf db-first-quarter-2018.backup.tar.gz db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-