Làm cách nào để xóa tất cả các tệp trong một thư mục ngoại trừ chỉ một số tệp được chỉ định?


11

Tôi muốn xóa tất cả các tệp trong một thư mục trong khi chỉ để lại một số tệp được chỉ định, chúng không có bất kỳ điểm chung nào theo tên. Làm thế nào tôi có thể đạt được điều đó?

Ví dụ: tên tệp tôi muốn giữ là:

file_1.png, another_file.jpg,some_music.mp3

Câu trả lời:


14

Nếu bạn đang sử dụng bash:

shopt -s extglob
rm -- !(file1|file2|file3)

Dòng đầu tiên chỉ kích hoạt khớp mẫu mở rộng và sau đó chúng tôi sử dụng một trong số chúng:

!(pattern-list) phù hợp với bất cứ điều gì ngoại trừ một trong các mẫu nhất định

và danh sách mẫu là danh sách một hoặc nhiều mẫu được phân tách bằng a |.


Hoặc với zsh

setopt extendedglob
rm -- ^(file1|file2)

Hoặc, di động hơn, sử dụng find:

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +

3
Có thể hữu ích khi bao gồm cách trả lại hành vi shell tùy chọn trở lại ( shopt -u extglob).
geedoubleya

7

Tạo một thư mục con tmp, di chuyển tất cả các tệp mà bạn muốn giữ vào thư mục đó và thực hiện rm -f *sau đó. Điều đó sẽ không ảnh hưởng đến tmpthư mục.

Sau đó chỉ cần làm:

mv tmp/* .
rmdir tmp

(Giả sử không có tệp nào bạn di chuyển bắt đầu bằng dấu chấm).

Đây là một trong số ít trường hợp sử dụng chuột và trình duyệt tệp như Nautilus, nơi bạn thực sự có thể - Ctrlbấm vài tệp bạn muốn giữ và sau đó sử dụng menu: Edit -> Invert Selectionđể lấy các tệp khác và sau đó xóa các tệp đó .


các tập tin di chuyển đến thư mục tmp âm thanh tốt đẹp. Dù sao, tôi phải làm điều này với dòng lệnh. Cảm ơn!
AGamePlayer

3
@AwQiruiGuo Tmp có lợi thế là lần đầu tiên phân tách các tệp thành hai bộ, trước khi loại bỏ những thứ bạn không muốn. Vì vậy, bạn có thể chạy lsđể xem nếu bạn không bỏ lỡ bất kỳ tệp nào bạn muốn lưu giữ.
Anthon

2

Thêm tên của các tệp bạn muốn giữ vào một tệp văn bản, mỗi tệp trên một dòng. Tập tin này không nên có trong thư mục hoặc bạn cũng nên thêm tên của nó.

Nếu tên thư mục của bạn là foo và tên của tệp là thanh , hãy làm như sau.

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

Điều này thực hiện như sau:

  1. find -type ftìm kiếm tên của tất cả các tệp trong foo và các thư mục con của nó và in chúng sang STDOUT. Với tùy chọn, -print0nó phân định tên tệp bằng byte NUL.
  2. grep -v -f barkhông bao gồm tất cả tên tệp khớp với một dòng trong thanh . Với tùy chọn, -znó xử lý đầu vào của nó như một tập hợp các dòng được phân tách bằng byte NUL, với tùy chọn, -Znó sẽ phân định đầu ra của nó bằng một byte NUL.
  3. xargs rmgọi rmliên tục để xóa các tập tin. Với tùy chọn, -0nó xử lý đầu vào của nó như một tập hợp các dòng được phân tách bằng byte NUL.

Điều này hoạt động với tên tệp chứa khoảng trắng.


Điều này sẽ không hoạt động vì tên tập tin có thể có dòng mới trong đó.
Anthon

@Anthon đã thay đổi các tùy chọn find, grep, xargs để đối phó với tên tệp chứa khoảng trắng, bao gồm cả dòng mới
Mathias Weidner

Nếu bạn muốn sử dụng, findtôi muốn làm hơnfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij
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.