Câu trả lời:
Bạn có thể sử dụng find
:
find . -type f ! -name '*.txt' -delete
Hoặc các tính năng toàn cầu mở rộng của bash:
shopt -s extglob
rm *.!(txt)
Hoặc trong zsh:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)
có !(*.txt)
?
rm
sẽ bị nghẹt nếu có thư mục.
find . -type f ! -name "*.txt" | xargs -r rm
sẽ hoạt động trong GNU \ xargs. Lệnh xargs BSD và UNIX có thể không có -r bạn phải kiểm tra cục bộ của mìnhman xargs
Nếu bạn chỉ muốn xóa tất cả các tệp ngoại trừ '* .txt' thì bạn có thể sử dụng lệnh sau:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
nhưng nếu bạn cũng muốn xóa các thư mục cùng với các tệp thì bạn có thể sử dụng điều này:
$ find . ! -name "*.txt" -exec rm -r {} \;
Bạn có thể sử dụng grep và xarg ngược
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
cũng hoạt động tốt
grep -v *.txt
sẽ chỉ hoạt động nếu có chính xác một .txt
tệp. Nếu không có, grep
sẽ sử dụng *.txt
làm mẫu; nếu có nhiều hơn một, nó sẽ tìm kiếm tên tệp đầu tiên bên trong tất cả các .txt
tệp khác , bỏ qua đầu ra từ ls
. (Kết quả chính xác có thể phụ thuộc vào tùy chọn toàn cầu của hệ vỏ.)
.txt$
sẽ khớp chuỗi kết thúc với txt
bất kể dấu chấm. Bởi vì grep
lấy biểu thức chính quy làm tham số. Vì vậy, các file a.txt
và aatxt
và a-txt
tất cả sẽ được kết hợp bởi biểu thức này. Biểu thức đúng nên được ls | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Đối với những người tò mò: Nếu bạn muốn chơi xung quanh với biểu thức một cách an toàn, hãy sử dụng biểu thức kiểm tra này ls | grep \\.txt$ | xargs --no-run-if-empty echo
(lưu ý: không có -v
cờ và rm=>echo
). Lưu ý2: bạn có thể đã nhận thấy dấu gạch chéo kép. Một là cho regex, một là cho bash để thoát dấu gạch chéo.
Đơn giản chỉ cần làm:
rm $(ls -I "*.txt" )
Loại tệp #Deletes ngoại trừ * .txt
Tương tự, nếu cần xóa "ngoại trừ một hoặc nhiều loại tệp", hãy:
rm $(ls -I "*.txt" -I "*.pdf" )
Các loại tệp #Deletes ngoại trừ * .txt & * .pdf
-I
tùy chọn có thể hữu ích, nhưng nhìn thấy lý do tại sao không phân tích ls . Và những gì | xargs
đạt được? Không có bất kỳ đối số, nó chỉ chạy echo
trên tất cả các đầu vào của nó.
xargs
cho là để đạt được?
Điều này cũng hoạt động để loại bỏ tất cả các tệp và thư mục bị ẩn (dấu chấm) ngoại trừ tệp đã nêu ( .mydir
):
rm -rf $(ls -aI ".mydir")
ls
trước khi thực sự cố gắng gọirm
.