Đôi khi bạn gặp phải tình huống cần xóa tất cả các tệp trong một thư mục hoặc đơn giản là dọn dẹp một thư mục bằng cách xóa tất cả các tệp ngoại trừ các tệp thuộc một loại nhất định (kết thúc bằng một phần mở rộng cụ thể).

Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách xóa tệp trong thư mục ngoại trừ một số phần mở rộng hoặc loại tệp nhất định bằng cách sử dụng rm, findglobignoreS.

Trước khi tiến xa hơn, chúng ta hãy bắt đầu bằng cách xem qua một khái niệm quan trọng trong Linux – đối sánh mẫu tên tệp, điều này sẽ cho phép chúng tôi giải quyết vấn đề của mình.

Đề xuất đọc: Sử dụng lệnh find để tìm kiếm nhiều tên tệp / tiện ích mở rộng trong Linux

Trong Linux, một mẫu shell là một chuỗi bao gồm các ký tự đặc biệt sau, được gọi là wildcards hoặc metacharacters:

  1. * – khớp với không hoặc nhiều ký tự
  2. ? – khớp với bất kỳ ký tự đơn nào
  3. [seq] – khớp với bất kỳ ký tự nào trong seq
  4. [!seq] – khớp với bất kỳ ký tự nào không có trong seq

Có ba phương pháp khả thi mà chúng ta sẽ khám phá ở đây, bao gồm:

Xóa tệp bằng toán tử đối sánh mẫu mở rộng

Các toán tử so khớp mẫu mở rộng khác nhau được liệt kê bên dưới, trong đó pattern-list là danh sách chứa một hoặc nhiều tên tệp, được phân tách bằng cách sử dụng | tính cách:

  1. *(pattern-list) – khớp với không hoặc nhiều lần xuất hiện của các mẫu được chỉ định
  2. ?(pattern-list) – khớp với không hoặc một lần xuất hiện của các mẫu được chỉ định
  3. +(pattern-list) – phù hợp với một hoặc nhiều lần xuất hiện của các mẫu được chỉ định
  4. @(pattern-list) – khớp với một trong các mẫu được chỉ định
  5. !(pattern-list) – phù hợp với bất kỳ thứ gì ngoại trừ một trong các mẫu đã cho

Để sử dụng chúng, hãy bật extglob tùy chọn shell như sau:

# shopt -s extglob

1. Để xóa tất cả các tệp trong một thư mục ngoại trừ tên tệp, hãy nhập lệnh bên dưới:

$ rm -v !("filename")
Xóa tất cả các tệp ngoại trừ một tệp trong Linux

2. Để xóa tất cả các tệp ngoại trừ filename1filename2:

$ rm -v !("filename1"|"filename2") 
Xóa tất cả các tệp ngoại trừ một số tệp trong Linux
Xóa tất cả các tệp ngoại trừ một số tệp trong Linux

3. Ví dụ dưới đây cho thấy cách xóa tất cả các tệp khác ngoài tất cả .zips tương tác:

$ rm -i !(*.zip)
Xóa tất cả các tệp ngoại trừ tệp Zip trong Linux
Xóa tất cả các tệp ngoại trừ tệp Zip trong Linux

4. Tiếp theo, bạn có thể xóa tất cả các tệp trong một thư mục ngoài tất cả .zip.odtnhư sau, trong khi hiển thị những gì đang được thực hiện:

$ rm -v !(*.zip|*.odt)
Xóa tất cả các tệp ngoại trừ một số phần mở rộng tệp nhất định
Xóa tất cả các tệp ngoại trừ một số phần mở rộng tệp nhất định

Khi bạn có tất cả các lệnh cần thiết, hãy tắt extglob tùy chọn shell như vậy:

$ shopt -u extglob

Xóa tệp bằng lệnh tìm Linux

Theo phương pháp này, chúng ta có thể sử dụng lệnh find độc quyền với các tùy chọn thích hợp hoặc kết hợp với xargs bằng cách sử dụng một đường dẫn như trong các biểu mẫu dưới đây:

$ find /directory/ -type f -not -name 'PATTERN' -delete
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. Lệnh sau sẽ xóa tất cả các tệp ngoại trừ .gzs trong thư mục hiện tại:

$ find . -type f -not -name '*.gz'-delete
Lệnh tìm - Xóa tất cả các tệp ngoại trừ các tệp .gz
Lệnh tìm – Xóa tất cả các tệp ngoại trừ các tệp .gz

6. Sử dụng một pipelinexargsbạn có thể sửa đổi trường hợp trên như sau:

$ find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}
Xóa tệp bằng lệnh find và xargs
Xóa tệp bằng lệnh find và xargs

7. Hãy để chúng tôi xem xét một ví dụ bổ sung, lệnh bên dưới sẽ xóa tất cả các tệp ngoại trừ .gz, .odt.jpgs trong thư mục hiện tại:

$ find . -type f -not (-name '*gz' -or -name '*odt' -or -name '*.jpg' ) -delete
Xóa tất cả các tệp ngoại trừ phần mở rộng tệp
Xóa tất cả các tệp ngoại trừ phần mở rộng tệp

Xóa tệp bằng biến Bash GLOBIGNORE

Tuy nhiên, cách tiếp cận cuối cùng này chỉ hoạt động với bash. Đây, GLOBIGNORE lưu trữ một danh sách mẫu được phân tách bằng dấu hai chấm (tên tệp) sẽ bị bỏ qua bởi phần mở rộng tên đường dẫn.

Đề xuất đọc: 12 ví dụ thực tế hữu ích về lệnh Grep trong Linux

Để sử dụng phương pháp này, hãy di chuyển vào thư mục mà bạn muốn dọn dẹp, sau đó đặt GLOBIGNORE như sau:

$ cd test
$ GLOBIGNORE=*.odt:*.iso:*.txt

Trong trường hợp này, tất cả các tệp khác ngoài .odt, .iso.txts với được xóa khỏi thư mục hiện tại.

Bây giờ hãy chạy lệnh để dọn dẹp thư mục:

$ rm -v *

Sau đó, tắt GLOBIGNORE:

$ unset GLOBIGNORE
Xóa tệp bằng biến Bash GLOBIGNORE
Xóa tệp bằng biến Bash GLOBIGNORE

Lưu ý: Để hiểu ý nghĩa của các cờ được sử dụng trong các lệnh ở trên, hãy tham khảo các trang hướng dẫn của mỗi lệnh mà chúng tôi đã sử dụng trong các hình minh họa khác nhau.

Đó là tất cả! Nếu bạn có bất kỳ kỹ thuật dòng lệnh nào khác cho mục đích tương tự, đừng quên chia sẻ với chúng tôi qua phần phản hồi của chúng tôi bên dưới.