Có cách nào để buộc gzip không ghi đè lên các tệp xung đột không?


17

Tôi đang viết một tập lệnh trong đó tôi đang tập tin.

Có khả năng tôi có thể nén một tệp, tạo một tệp cùng tên và cố gắng giải nén tệp này, vd

$ ls -l archive/
total 4
-rw-r--r-- 1 xyzzy xyzzy  0 Apr 16 11:29 foo
-rw-r--r-- 1 xyzzy xyzzy 24 Apr 16 11:29 foo.gz

$ gzip archive/foo
gzip: archive/foo.gz already exists; do you wish to overwrite (y or n)? n   
    not overwritten

Bằng cách sử dụng gzip --force, tôi có thể buộc gzip ghi đè lên foo.gz, nhưng trong trường hợp này, tôi nghĩ rằng có khả năng tôi có thể bị mất dữ liệu nếu tôi ghi đè lên foo.gz. Dường như không có một công tắc dòng lệnh nào để buộc gzip để .gzcác tệp một mình ... một phiên bản không tương tác của việc nhấn 'n' tại dấu nhắc.

Tôi đã thử gzip --noforcegzip --no-forcehy vọng rằng những cái này có thể tuân theo tiêu chuẩn tùy chọn GNU, nhưng cả hai đều không hoạt động.

Có một công việc thẳng về phía trước cho điều này?

Biên tập:

Nó chỉ ra rằng đây là một trong những lần nó trả tiền để đọc trang thông tin chứ không phải trang người đàn ông.

Từ trang thông tin:

`--force'
`-f'
     Force compression or decompression even if the file has multiple
     links or the corresponding file already exists, or if the
     compressed data is read from or written to a terminal.  If the
     input data is not in a format recognized by `gzip', and if the
     option `--stdout' is also given, copy the input data without
     change to the standard output: let `zcat' behave as `cat'.  If
     `-f' is not given, and when not running in the background, `gzip'
     prompts to verify whether an existing file should be overwritten.

Trang man bị thiếu văn bản và khi không chạy trong nền

Khi chạy trong nền, gzip sẽ không nhắc và sẽ không ghi đè trừ khi -ftùy chọn được gọi.


3
Tôi không chắc chắn cách gzip kiểm tra xem có nền không, nhưng thêm '&' vào bash trên hệ thống tôi đang làm việc không làm điều đó. Tuy nhiên, ở phía bên kia của một đường ống dường như hoạt động, vì vậy thay vì: find ./ ! -name "*gz" -exec gzip {} \; & điều này hoạt động: find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip báo cáo gzip: gzip: ./2012-July.txt.gz already exists; not overwritten
Bill McGonigle

1
@BillMcGonigle Nhận xét của bạn phải là câu trả lời!
Rockallite

Câu trả lời:


9

Tôi nhận ra rằng cách tốt nhất để tránh hiệu ứng không mong muốn là không yêu cầu chương trình thực hiện hiệu ứng không mong muốn. Đó là, đơn giản là đừng bảo nó nén tệp nếu tệp đã có ở dạng nén.

ví dụ:

if [ ! -f "$file.gz" ]; then 
    gzip "$file"; 
else 
    echo "skipping $file"
fi

hoặc ngắn hơn (chạy truenếu có tệp.gz, nén tệp khác)

[ -f "$file.gz" ] && echo "skipping $file" || gzip "$file"    

Thật không may, điều này đang được chạy như một lệnh hệ thống bên trong tập lệnh perl (câu chuyện dài về lý do tại sao chúng tôi không sử dụng cái gì đó như IO :: Compress :: Gzip, tin tôi đi, tôi đã nghĩ về nó). Lệnh nén được lưu trữ trong một tệp cấu hình. Lệnh sau của bạn có vẻ gần với những gì tôi cần, nhưng tôi nghĩ rằng tôi đã tìm thấy thứ gì đó phù hợp với nhu cầu của mình hơn một chút. Tôi sẽ chấp nhận câu trả lời của bạn, bởi vì đó là một giải pháp chung tốt hơn của tôi, nhưng hãy xem bên dưới để biết những gì tôi thực sự sẽ sử dụng.
Barton Chittenden

Bạn có thể poke một tập tin trong Perl ...
Ярослав Рахматуллин

1
Tôi không rõ ý của bạn là gì poke a file.
Barton Chittenden

Thiếu liên kết / sử dụng hình ảnh trong giao tiếp hàng ngày bằng tiếng Anh Mỹ làm tôi ngạc nhiên mỗi lần :) Hãy để tôi thử và giải thích. Bắt đầu một hình ảnh của một đứa trẻ chọc một con quạ đã chết bằng một cây gậy để xem nó còn sống hay không. Poking được sử dụng để thăm dò các thuộc tính ở đây. Tương tự như vậy, chọc một tập tin có nghĩa là để kiểm tra một cái gì đó về nó, chẳng hạn như nếu nó hiện tại. Ở mức độ nào, tôi cảm thấy hành động chọc vào ít nhất có nghĩa là "đạt được liên lạc với một đối tượng bên ngoài" , và điều đó đủ để nói "lấy một số thông tin về một tập tin" bằng một hình ảnh, thay vì đánh vần nó.
Ярослав Рахматуллин

"Chọc" thường là tiếng lóng của hacker để đặt vị trí bộ nhớ. Xem: vi.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
Bill McGonigle

12

Điều gần nhất mà tôi có thể tìm thấy cho một lệnh duy nhất là như sau:

yes n | gzip archive/foo

Các yesbản in lệnh ytheo sau là một linefeed stdout cho đến khi nó nhận được một tín hiệu. Nếu nó có một đối số, nó sẽ in nó thay vì y. Trong trường hợp này, nó in ncho đến khi gzip thoát, do đó đóng đường ống.

Điều này tương đương với việc nhập nnhiều lần trên bàn phím; điều này sẽ tự động trả lời câu hỏigzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

Tôi nói chung, tôi nghĩ rằng tốt hơn hết là đừng cố nén các tệp nếu tệp được nén tương ứng tồn tại; giải pháp của tôi là ồn ào hơn, nhưng nó phù hợp với nhu cầu cụ thể của tôi để thay thế gziplệnh thả xuống , ngồi trong một tệp cấu hình.


1
một phiền toái khác với điều này là gziplối thoát2
Steven Penny
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.