Làm thế nào để xóa tất cả trừ một tệp trong Unix? [bản sao]


Câu trả lời:


20
ls * | grep -v dont_delete_this_file | xargs rm -rf 

Thí dụ :

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

Để xóa tất cả các tệp ngoại trừ 'test2':

ls * | grep -v test2 | xargs rm -rf

Sau đó, đầu ra 'ls' là:

test2

BIÊN TẬP:

Cảm ơn các bình luận. Nếu thư mục chứa một số tệp có khoảng trắng:

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

Bạn có thể sử dụng (với bash):

rm !("test 1"|"test 4")

đầu ra 'ls':

test 1
test 4

Sẽ làm điều tương tự bằng cách sử dụng find, nhưng công việc của bạn và bạn đã nhanh hơn. +1
Rory Alsop

2
Điều này không thành công nếu bạn có tệp có khoảng trắng trong tên của chúng.
Mat

Để xử lý tên tệp có khoảng trắng người ta có thể sử dụngls -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer

8

Giả sử bạn đang sử dụng bash shell (trường hợp phổ biến nhất), bạn có thể sử dụng biểu tượng phủ định phủ định (mở rộng tên đường dẫn):

rm -rf !(myfile.txt)

Điều này sử dụng tính năng mở rộng toàn cầu, vì vậy bạn sẽ cần bật tính năng này trước:

shopt -s extglob

1
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .

1
ln myfile.txt .myfile.txt && rm -rf * && mv .myfile.txt myfile.txt


0

Đối với một đệ quy, rmbạn cần thực hiện đệ quy findvà loại trừ (các) tệp bạn muốn giữ (hoặc grep, nhưng điều đó có thể khiến bạn gặp rắc rối về khoảng trắng). Đối với shell toàn cầu, các shell hiện đại có các mẫu toàn cầu có thể được sử dụng để loại trừ các tệp; điều này có thể được kết hợp với đệ quy toàn cục cấp vỏ khi có sẵn (ví dụ: zshrm **/*~foo/bar- lưu ý rằng điều này có khả năng chạy trong giới hạn độ dài đối số cho các cây thư mục lớn).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.