gzip tất cả các tập tin mà không xóa chúng


11

Tôi cần gzip tất cả các tệp trong một thư mục riêng biệt bao gồm tất cả các tệp trong thư mục con mà không xóa các bản gốc sau đó. Vì vậy, hãy nói rằng tôi có index.html, tôi muốn có ở cuối index.html.gzip AND index.html.

Tôi có thể gzip tất cả các tệp trong thư mục của mình thông qua

gzip -r .

Nhưng tôi cũng muốn giữ các tập tin gốc.

Điều này có thể không?

Câu trả lời:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

Việc -cđẩy kết quả đến thiết bị xuất chuẩn và giữ nguyên bản gốc. Nhược điểm là, bạn cần phải tự tìm các tập tin. find(1)Tuy nhiên, để di chuyển phức tạp hơn, bạn có thể sử dụng , như trên: .tìm kiếm bắt đầu từ thư mục hiện tại và -type ftrả về tên của mọi tệp thông thường.


Tại sao *.*trong ls?

@pooh: *.*khớp với tất cả các tệp được đặt tên thường xuyên và thường không có thư mục. Tất nhiên, nó chỉ hoạt động trong hầu hết các trường hợp và thường là không nếu bạn cần nó. Sau đó sử dụng findlệnh.
Boldewyn

@Boldewyn: câu hỏi là gzip tất cả các tệp trong một thư mục. ls *.*sẽ không chọn các tệp như TODO .

lslà không cần thiết ở tất cả : for x in *. Tuy nhiên, sử dụng findnên được find . -type f | while read -r x.
Tạm dừng cho đến khi có thông báo mới.

Cập nhật câu trả lời. Cảm ơn đã -rbật read.
Boldewyn

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

Bạn có thể dễ dàng chuyển nó xung quanh để bao gồm những gì bạn muốn nén ( -name '*.txt -or -name '*.htmlv.v.) thay vì như bây giờ, ngoại trừ một số tệp (đã được nén, sao lưu và các tệp tạm thời).

Xử lý không gian trong tên tệp cũng tốt.

Thay đổi gzipđể echo gzipthử nghiệm. Hoặc bỏ qua phần -exec tất cả cùng nhau.

Chỉnh sửa: Ồ, tôi quên đề cập rằng điều này không kiểm tra nếu <target>.gzđã tồn tại. Điều này có thể hoặc không thể là một vấn đề.

Edit2: Ok, ở đây chúng tôi đi với một cái gì đó kiểm tra tệp hiện có. Nếu điều đó có thể được muốn. Xin tha thứ cho oneliney.

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

My find-foo có lẽ không phải là những gì nó có thể, rất có thể có thể bỏ qua trực tiếp trong tìm kiếm.


1
chỉ cần đọc -name nên đến trước -type để tránh gọi stat trên mỗi tệp.

@Ben Làm cho ý nghĩa, đầu vào tốt! Đối với cây lớn, nó có thể được chú ý.
Plundra

2

Chỉ cần thêm tùy chọn -c, tôi nghĩ rằng nó sẽ hoạt động


1
Điều này có lẽ chỉ hoạt động khi gzipping một tập tin tại một thời điểm.
it_me


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.