Không bao gồm các tệp và thư mục nhất định khi xóa tệp


11

Thư mục cấp cao nhất của tôi là data. databao gồm một số thư mục và các thư mục này có thư mục con. Tôi cần phải xóa tất cả các tệp và thư mục bên trong data/ngoại trừ một số tệp trong một số thư mục.

Ví dụ, dữ liệu bao gồm các thư mục 100101. Tôi chỉ muốn giữ a.txtb.txtcác tệp trong 100/c.txtd.txtcác tệp trong 101/khi xóa tất cả các tệp và thư mục khác trong 100101.

Thí dụ:

.
├── 100
   ├── a.txt
   ├── b.txt
   ├── c.txt
   └── d.txt
└── 101
    ├── a.txt
    ├── b.txt
    ├── c.txt
    └── d.txt

Tôi sử dụng rm -rf !(a.txt|b.txt)lệnh nhưng tôi không thể tự động áp dụng lệnh này cho mỗi thư mục.

Câu trả lời:


12

Như bạn đã biết, bạn có thể sử dụng extglobtính năng được kích hoạt với:

shopt -s extglob

Điều này cho phép loại trừ các kết quả khớp để bạn có thể thực hiện những việc như:

rm 100/!([ab].txt) 101/!([cd].txt)

Đó là một ý tưởng tốt để kiểm tra nó với echođầu tiên. Ví dụ này sẽ khớp với bất cứ thứ gì bên trong 100/không a.txthoặc b.txtvà bất cứ thứ gì bên trong 101/không c.txthoặc d.txt. Nếu các quy tắc tương tự để 100/áp dụng cho 102/tốt, bạn có thể làm, ví dụ:

10[02]/!([ab].txt) # or
{100,102}/!([ab].txt)

Tôi chỉ đưa ra một ví dụ cho 100 và 101 thư mục nhưng trong thực tế số lượng thư mục con gần 20. Có cách nào để thực hiện mã trên cho mỗi thư mục mà không cần viết từng tên thư mục trong thư mục chính không?
Deepblue

@deepblue Vui lòng cung cấp một ví dụ chính xác cho câu hỏi của bạn ( chỉnh sửa ), đặc biệt không rõ làm thế nào rmđể biết những tập tin nào cần giữ trong thư mục nào nếu bạn không muốn chỉ định điều đó.
tráng miệng

7

Bạn có thể sử dụng findcho việc này. Bạn có thể phủ nhận các bài kiểm tra findbằng -nothoặc !. Điều này sẽ loại trừ các trận đấu, thay vì tìm thấy chúng.

Bạn nên cẩn thận không xóa bất kỳ thư mục mẹ nào của các tệp bạn muốn giữ, đặc biệt là thư mục hiện tại . , vì vậy hãy đảm bảo bạn đọc kỹ đầu ra trước khi xóa.

Dựa trên ví dụ của bạn, bạn có thể làm một cái gì đó như thế này từ datathư mục.

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt"

Thêm một ! -path ./path/to/dircho bất kỳ con đường bạn muốn tránh xóa. Bạn có thể sử dụng các siêu ký tự như *, nhưng đảm bảo rằng bạn trích dẫn biểu thức nếu bạn làm, ví dụ "./path*dir", để ngăn chặn mọi mở rộng không mong muốn.

findđược đệ quy theo mặc định. Ngay cả khi chúng tôi không tìm thấy ./100ở đây, chúng tôi sẽ tìm thấy tất cả nội dung của nó trừ khi chúng khớp với mẫu [ab].txt. Nếu bạn không thể khớp tất cả các tên bạn muốn giữ, hãy thêm một bài kiểm tra khác:

! -path "./100/[ab].txt" ! -path ./100/foo

Điều này sẽ không tìm thấy a.txthoặc b.txthoặc foo, nhưng nó sẽ tìm thấy tất cả các file khác.

Khi bạn chắc chắn bạn thấy những gì bạn muốn, bạn có thể thêm -deletevào cuối để xóa các tập tin tìm thấy:

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt" -delete
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.