Làm thế nào để chỉ nén các tập tin của một người dùng cụ thể?


7

Tôi thích zip, nó đơn giản, nhưng gần đây tôi có nhu cầu chỉ nén tệp do một người dùng sở hữu trong một thư mục.

Tôi đọc hướng dẫn và tôi không thể tìm thấy bất kỳ tùy chọn nào, ví dụ như làm những việc như:

zip /tmp/file.zip -own antoine -r /usr/something/* 

Tôi có bỏ lỡ tùy chọn không hoặc có thể với định dạng chuẩn lưu trữ khác (Tôi mở để đề xuất mặc dù tôi làm việc trên AIX và có thể bỏ lỡ một số tùy chọn hoặc nhị phân)


Nếu tên tệp và tên thư mục không có khoảng trắng, bạn có thể sử dụng đầu ra find -user antoinedưới dạng đối số để nén. zipThật không may, không có tùy chọn để đọc tên tệp được phân tách bằng NUL và do đó không xử lý tốt các tệp có khoảng trắng và dòng mới trong tên nếu được cung cấp từ một lệnh khác. Thay thế là để viết một kịch bản python, nó có một mô-đun zip tốt và có tên tệp đặc biệt dễ dàng xử lý.
Anthon

@anthon, tôi nghĩ rằng có thể giải quyết tình huống thực tế của tôi vì không có tập tin nào có được một khoảng trống trong đó
Kiwy

Câu trả lời:


11

Bạn có thể thử tìm các tệp có liên quan với find:

find /usr/something -maxdepth 1 -user antoine

Sau đó, bạn có thể sử dụng -execđể tạo tệp zip từ kết quả của find:

find /usr/something -maxdepth 1 -user antoine -exec zip /tmp/file.zip {} +

để lại maxdepth nếu bạn muốn tái diễn.


-own? : D bạn có chắc không
Kiwy

@Kiwy cố gắng làm hai việc cùng một lúc, được cập nhật
Anthon

cũng cảm ơn nó hoạt động nhưng tôi sẽ đợi nếu có ai đến với posixygiải pháp kỳ diệu từ hư không trước khi chấp nhận câu trả lời :-)
Kiwy

@Kiwy afaik không có Python tuân thủ POSIX: p
Anthon

@Kiwy, không có POSIX zip. Tương đương POSIX -maxdepth 1\( -name . -o -prune \)mặc dù ở đây rất có thể bạn muốn -mindepth 1 -maxdepth 1, đó là ! -name . -prune.
Stéphane Chazelas

6

Với zsh:

zip mine.zip ./*(.U)

để nén các tập tin (thông thường) của tôi.

zip antoine.zip ./*(.u:antoine:)

để zip antoine


1
Nếu bạn không sử dụng zsh, nhưng bạn đã cài đặt nó (OS X cung cấp một bản sao), bạn có thể sử dụng zsh -c 'zip ...'.
Blacklight Shining

không may mắn không cài đặt zsh, nghĩ rằng giải pháp này rất hay, tôi nên xem cái zsh này
Kiwy 17/03/2016

5

Chỉ sử dụng các tính năng khả dụng trên AIX hoặc các hệ thống POSIX khác và khó hơn:

find /usr/something/* /usr/something/.[!.]* /usr/something/..?* \
     -prune -type f -user antoine -exec zip -r /tmp/file.zip {} +

findđệ quy vào các thư mục con. Để tránh điều đó, hãy -prunebảo nó đừng đi vào các thư mục mà nó gặp. Điều đó không tốt nếu tôi chạy find /usr/something -type d -prune -o …vì sau đó /usr/somethingsẽ bị bỏ qua. Vì vậy, tôi chạy findtrên tất cả các mục trong thư mục đó, ngoại trừ ....

Một thành ngữ dễ dàng hơn là chuyển sang thư mục và .đặc biệt xử lý thư mục bắt đầu . Ở đây, nó sẽ thay đổi kho lưu trữ kết quả, trong đó sẽ có các đường dẫn của biểu mẫu ./foothay vì usr/something/foo. Kỹ thuật này dựa trên thực tế là -name .chỉ phù hợp với thư mục bắt đầu, mọi tệp gặp phải khác sẽ có tên riêng.

cd /usr/something &&
find . ! -name . -prune -type f -user antoine -exec …

Lưu ý rằng zipcó thể được thực thi nhiều lần nếu danh sách tên tệp quá dài cho một lệnh gọi. Điều này là ổn vì zip -rthay thế các tập tin hiện có trong kho lưu trữ; nếu bạn sử dụng một trình lưu trữ khác, lưu ý không gọi nó trong chế độ nơi nó sẽ tạo một kho lưu trữ mới (ví dụ: không sử dụng tar -c).


Bạn có thể find /usr/something/. ! -name . -prune ...không cần phải cdnhập nó hoặc chuyển toàn bộ danh sách tệp để findsử dụng ký tự đại diện.
Stéphane Chazelas 17/03/2016

3

Làm thế nào về

find /usr/something -maxdepth 1 -user antoine | zip /tmp/file.zip -@
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.