Học bằng cách đọc theo thứ tự

Tìm tệp — find và ký tự đại diện

Học cách chỉ định nhiều tên tệp cùng lúc bằng các ký tự đại diện * ? [], và cách find tìm theo tên với -name và theo loại với -type — thực hành ngay trên terminal trong trình duyệt.

Ký tự đại diện — * ? []

Ký tự đại diện là các ký hiệu để chỉ định một phần tên tệp theo lô.

* khớp một dãy không hoặc nhiều ký tự, ? khớp đúng một ký tự, và [] khớp bất kỳ một trong các ký tự bên trong dấu ngoặc.

Kết hợp chúng với ls, như ls *.txt, để chỉ liệt kê những tên khớp.

Mỗi ký tự đại diện khớp gì
*.txtfile?.logdata[12].csvmọi tệp kết thúc .txtmột ký tự sau filedata1.csv hoặc data2.csv
* khớp một dãy bất kỳ, ? khớp một ký tự, và [] khớp bất kỳ một ký tự bên trong dấu ngoặc.
Ký hiệuKhớp gìVí dụTệp khớp
*Một dãy không hoặc nhiều ký tự*.txta.txt note.txt
?Đúng một ký tựlog?.txtlog1.txt (log10.txt không khớp)
[...]Bất kỳ một ký tự bên trong dấu ngoặclog[12].txtlog1.txt log2.txt
[a-c]Bất kỳ một ký tự trong khoảngf[a-c].txtfa.txt fb.txt fc.txt
touch a.txt b.txt note.log         # tạo các tệp dữ liệu
ls *.txt                           # a.txt b.txt
ls *.log                           # note.log
ls ?.txt                           # a.txt b.txt (một ký tự + .txt)

① Tạo ba tệp với phần mở rộng khác nhau bằng touch a.txt b.txt note.log.

② Kết hợp một ký tự đại diện với ls để chỉ liệt kê những tệp kết thúc bằng .txt.

③ Tiếp theo liệt kê chỉ những tệp kết thúc bằng .log, và xác nhận rằng bạn có thể thu hẹp theo tên. (Chạy đúng thì phần giải thích sẽ hiện ra.)

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...

Một ký tự hoặc một lựa chọn — ? và []

? luôn khớp đúng một ký tự, nên dùng nó khi bạn muốn cố định số lượng ký tự.

[] khớp bất kỳ một trong các ký tự viết bên trong dấu ngoặc, nên [12] là 1 hoặc 2, và bạn có thể viết một khoảng như [a-c].

Chúng thu hẹp đích chi tiết hơn so với *.

touch log1.txt log2.txt log9.txt logA.txt   # tạo dữ liệu
ls log?.txt                                  # 4 tệp với một ký tự cuối
ls log[12].txt                               # chỉ log1.txt log2.txt

① Tạo bốn tệp đặt tên theo thứ tự bằng touch log1.txt log2.txt log9.txt logA.txt.

② Kết hợp ls với ? để liệt kê các tệp mà log theo sau bởi một ký tự và kết thúc bằng .txt.

③ Dùng [] để thu hẹp xuống chỉ còn log1.txtlog2.txt. Rồi xác nhận một khoảng như [1-2] thu hẹp về cùng 2 tệp đó.

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...

Tìm theo điều kiện — find -name / -type

find duyệt đệ quy bên dưới một thư mục bắt đầu và tìm những thứ khớp một điều kiện.

Với find start -name 'pattern' bạn điều kiện theo tên, và với -type f (tệp) hoặc -type d (thư mục) bạn điều kiện theo loại.

Dùng nó để tìm tệp theo tên khi chúng nằm sâu trong cấu trúc phân cấp.

Điều kiệnÝ nghĩaVí dụ
-name 'pattern'Tên khớp patternfind . -name '*.log'
-type fChỉ tệp thườngfind . -type f
-type dChỉ thư mụcfind . -type d
Điều kiện của find và thứ chúng khớp
find . -name '*.txt'find . -type ffind . -type dmục tên .txtchỉ tệpchỉ thư mục
-name lọc theo pattern tên, -type f theo tệp, và -type d theo thư mục.
mkdir -p tree/sub                  # tạo cây dữ liệu
touch tree/a.txt tree/sub/b.txt    # đặt tệp trong cấu trúc phân cấp
find tree -name '*.txt'            # tìm .txt dưới tree đệ quy
find tree -type d                  # chỉ thư mục dưới tree

Đặt pattern của find trong dấu nháy

Bao '*.txt' trong find . -name '*.txt' bằng dấu nháy đơn.

Không có dấu nháy, shell sẽ mở rộng * trước, có thể nhắm vào thứ khác với ý định của bạn.

Quy tắc cơ bản là đặt pattern của -name trong dấu nháy và truyền nó cho chính find.

① Tạo một thư mục hai cấp bằng mkdir -p tree/sub.

② Đặt tệp trong cả thư mục cha lẫn thư mục con bằng touch tree/a.txt tree/sub/b.txt.

③ Truyền tree cho find làm điểm bắt đầu và tìm đệ quy các tệp .txt theo điều kiện tên.

④ Tiếp theo chỉ liệt kê tệp theo điều kiện loại (find tree -type f), cũng liệt kê chỉ thư mục, và so sánh ba kết quả.

Linux console
0 / 5 đã hoàn thành
Loading Linux Terminal...
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Ký tự đại diện * khớp gì?

Câu 2ls log[12].txt khớp những tệp nào?

Câu 3Điều gì được hiển thị khi bạn chạy find tree -type d?