Linux gzip nhiều thư mục con vào kho lưu trữ riêng biệt?


16

Làm thế nào tôi có thể nén các thư mục con vào kho lưu trữ riêng biệt?

Thí dụ:

directory
 subdir1
 subdir2

Nên tạo subir1 (.tar) .gz và subir2 (.tar) .gz

Câu trả lời:


27

Kịch bản nhỏ này dường như là lựa chọn tốt nhất của bạn, đưa ra các yêu cầu của bạn:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Nó xử lý đúng các thư mục có khoảng trắng trong tên của chúng.


Nó cho tôi lỗi này: bash: -c: dòng 1: lỗi cú pháp: kết thúc tệp không mong muốn
EarthMind

@EarthMind: Nó hoạt động tốt ở đây. Kiểm tra nếu tập lệnh được sao chép chính xác.
Juliano

@EarthMind: Tôi không chắc bạn đã đánh vần tốt câu hỏi ban đầu. Bạn muốn chạy lại cái này và nhận các tệp .tar.gz mới trong khi để các tệp .tar.gz trước đó một mình? Hãy thử thêm "tmstamp = $ (ngày '+% Y% m% d-% H% M')" và thay đổi $ {base} thành $ {base} - $ {tmstamp}.
freiheit

2
@EarthMind: nếu bạn định đặt mọi thứ vào một dòng, hãy đảm bảo có dấu chấm phẩy (;) ngay trước lệnh tar. Mặt khác, cơ sở được truyền dưới dạng biến môi trường thành tar, thay vì là biến phụ trợ shell.
Juliano

@mwojtera chỉnh sửa đã cố gắng của bạn nên là câu trả lời của riêng nó
gà con

10

Còn cái này thì sao: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Giải thích: Bạn chạy tìm trên tất cả các mục trong thư mục hiện tại. Maxdepth 0 làm cho nó không lặp lại bất kỳ giá trị nào thấp hơn các đối số đã cho. (Trong trường hợp này * hoặc tất cả các mục trong thư mục hiện tại của bạn) Đối số 'd' với "-type" chỉ khớp với các thư mục. Sau đó exec chạy tar trên bất cứ thứ gì phù hợp. ({} được thay thế bằng tệp phù hợp)


1
Nhưng sau đó tôi vẫn nhận được lỗi rằng đường dẫn đã cho là một thư mục chứ không phải tệp
EarthMind

3
gzip một mình không lưu trữ các thư mục
Juliano

Bạn cần tar thư mục trước khi bạn có thể gzip chúng.
ℝaphink

1
Bạn cần tar với tùy chọn z, không phải gzip thẳng cho các thư mục. Cách sử dụng rất tốt đẹp, mặc dù.
freiheit

3
Lỗi: "find: đường dẫn phải đứng trước biểu thức :;" Phần đầu tiên hoạt động, vì vậy tôi đã sử dụng (chỉ thư mục): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK

4

Điều này sẽ tạo một tệp có tên blah.tar.gz cho mỗi tệp trong thư mục có tên là blah.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Nếu bạn có nhiều hơn các thư mục đơn giản trong thư mục (ví dụ như các tệp, vì ls sẽ trả về mọi thứ trong thư mục), thì hãy sử dụng:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Grep -v loại trừ thư mục hiện tại sẽ hiển thị trong findlệnh theo mặc định.


3
Cả ls và find đều KHÔNG được sử dụng theo cách này. Đặc biệt, nó nhằm mục đích trình bày các tệp trong danh sách người dùng có thể đọc được, không tạo ra danh sách tệp dưới dạng đối số cho 'cho'. Chỉ cần sử dụngfor dir in *
Juliano

1
Tôi đã thử đề xuất đầu tiên của bạn nhưng nó không hoạt động với các thư mục chứa khoảng trắng trong tên của họ
EarthMind

Hơn nữa, lệnh đầu tiên cũng sẽ tạo một tarball cho mỗi tệp trong thư mục.
ℝaphink
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.