Nén mọi tệp trong một thư mục vào tệp nén của riêng nó


24

Làm cách nào để nén mọi tệp trong một thư mục vào tar riêng của nó trong khi giữ tên cho mỗi tệp?

tức là file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

Câu trả lời:


64

Đặt mọi tệp vào một tệp tar riêng biệt sẽ không có ý nghĩa gì trong kịch bản này. Bạn có thể sử dụng gzipđể nén chúng trực tiếp:

gzip *

sẽ dẫn đến file1.out.gz, file2.out.gzvv

Bạn sẽ tarchỉ sử dụng nếu bạn cần một kho lưu trữ nén dưới dạng một tệp.

Nếu bạn cần một kho lưu trữ tar cho mỗi tệp, bạn có thể tạo nó như sau:

for i in *; do tar -czf $i.tar.gz $i; done

7
+1 - Không có lý do để tạo tar (Băng ARchive) cho một tệp. Chỉ cần nén những gì bạn muốn nén - kết quả sẽ nhỏ hơn một chút và có ý nghĩa hơn nhiều đối với những người giải nén các tệp.
voretaq7

Để tar từng thư mục con riêng lẻ (chỉ sâu một cấp) và xóa bản gốc:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.

(không thể chỉnh sửa nhận xét của tôi ở trên sau 5 phút) Phiên bản đơn giản / an toàn hơn:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.

9

Để xây dựng dựa trên câu trả lời của @ SvenW (sẽ chỉ hoạt động trên thư mục hiện tại), nếu bạn có số lượng tệp LỚN hoặc muốn thực hiện trên cấu trúc thư mục đệ quy, bạn cũng có thể sử dụng

find . -type f -exec gzip \{\} \;

và nếu bạn cần đặt đầu ra vào một thư mục khác (trong ví dụ này ../target) và không muốn xóa bản gốc, bạn có thể làm một cái gì đó như:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

1
find . -type f -exec gzip {} \;sẽ là đủ Mã thứ hai sẽ thất bại với tên tệp chứa khoảng trắng và tương tự.
người dùng không xác định

Một số shell không thích {} s và lớp thứ hai làm một cái gì đó khác biệt rõ rệt so với cái đầu tiên (và tôi đã nhận thức được các vấn đề về khoảng cách nhưng đó là loại khó xử lý).
lông mịn

Nếu bạn biết một cái vỏ như vậy, tôi mời bạn trả lời câu hỏi của tôi ở đây: unix.stackexchange.com/questions/8647/ trộm . Không ai có thể đặt tên cho một cái gì đó ngày nay được sử dụng cho đến nay. Nếu bạn nhận thức được rủi ro cho câu trả lời của mình, có thể nên đặt tên cho câu trả lời của bạn.
người dùng không xác định

@userunknown Tôi đã được đưa lên (t) csh, người đã gặp khá nhiều rắc rối với niềng răng xoăn không được giải thoát cùng một lúc, mặc dù nó không xuất hiện nữa (nhưng tôi vẫn trốn thoát {}như một thói quen). Tuy nhiên, những người khác đã đăng chúng dưới dạng câu trả lời cho câu hỏi của bạn.
fluffy

Hoặc, để nén tất cả các tệp không nhị phân:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.

0

Hãy thử cái này:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
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.