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)?
rmsẽ bị nghẹt nếu có thư mục.
find . -type f ! -name "*.txt" | xargs -r rmsẽ 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 rmcũng hoạt động tốt
grep -v *.txtsẽ chỉ hoạt động nếu có chính xác một .txttệp. Nếu không có, grepsẽ sử dụng *.txtlà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 .txttệ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 txtbất kể dấu chấm. Bởi vì greplấy biểu thức chính quy làm tham số. Vì vậy, các file a.txtvà aatxtvà a-txttấ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ó -vcờ 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
-Itù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 echotrên tất cả các đầu vào của nó.
xargscho 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")
lstrước khi thực sự cố gắng gọirm.