वहाँ एक तरीका है gzip मजबूर करने के लिए संघर्ष पर फ़ाइलों को अधिलेखित नहीं है?


17

मैं एक स्क्रिप्ट लिख रहा हूं जिसमें मैं फाइलों को जिप्पी कर रहा हूं।

एक संभावना है कि मैं एक फ़ाइल को ज़िप कर सकता हूं, उसी नाम की एक फ़ाइल बना सकता हूं, और इसे भी जिप करने का प्रयास कर सकता हूं, जैसे;

$ 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

का उपयोग करके gzip --force, मैं gzip को अधिलेखित करने के लिए बाध्य कर सकता हूं foo.gz, लेकिन इस मामले में, मुझे लगता है कि अगर मैं अधिलेखित हो जाता हूं तो एक अच्छा मौका है कि मैं डेटा खो सकता हूं foo.gz। वहाँ एक कमांड लाइन स्विच करने के लिए .gzअकेले फ़ाइलों को छोड़ने के लिए मजबूर करने के लिए मजबूर नहीं लगता ... प्रॉम्प्ट पर 'n' दबाने का एक गैर-संवादात्मक संस्करण।

मैंने कोशिश की gzip --noforceऔर gzip --no-forceउम्मीद है कि ये GNU विकल्प मानक का पालन कर सकते हैं, लेकिन इनमें से किसी ने भी काम नहीं किया।

क्या इसके लिए सीधे आगे का काम है?

संपादित करें:

यह पता चला है कि यह एक बार है कि यह मैन पेज के बजाय सूचना पृष्ठ को पढ़ने के लिए भुगतान करता है।

जानकारी पृष्ठ से:

`--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.

मैन पेज पाठ याद आ रहा था और जब पृष्ठभूमि में नहीं चल रहा था

जब पृष्ठभूमि में चल रहा है, तो gzip संकेत नहीं देगा, और जब तक कि -fविकल्प को लागू नहीं किया जाता है तब तक इसे अधिलेखित नहीं किया जाएगा।


3
मुझे यकीन नहीं है कि कैसे gzip पृष्ठभूमि के लिए जाँच करता है, लेकिन मैं जिस सिस्टम पर काम कर रहा हूं, उस पर 'और' जोड़कर यह नहीं करता है। एक पाइप के दूसरी तरफ होने के नाते, हालांकि, इसके बजाय काम करने लगता है: find ./ ! -name "*gz" -exec gzip {} \; & यह काम करता है: find ./ ! -name "*gz" -print0 | xargs -0 -n 1 -t gzip gzip रिपोर्ट: gzip: ./2012-July.txt.gz already exists; not overwritten
बिल मैकगोनिग

1
@BillMcGonigle आपकी टिप्पणी का उत्तर होना चाहिए!
रॉकलाईट

जवाबों:


9

इसने मुझ पर यह आरोप लगाया है कि अवांछित प्रभाव से बचने का सबसे अच्छा तरीका है कि कार्यक्रम को अवांछित प्रभाव का प्रदर्शन करने के लिए कहा जाए। यदि फ़ाइल पहले से ही संपीड़ित रूप में मौजूद है, तो इसे फ़ाइल को संपीड़ित करने के लिए नहीं कहें।

उदाहरण के लिए:

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

या उससे कम ( trueयदि कोई file.gz है, तो फ़ाइल को संपीड़ित करें)

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

दुर्भाग्य से, यह एक पर्ल कमांड के अंदर एक सिस्टम कमांड के रूप में चलाया जा रहा है (इस बारे में लंबी कहानी कि हम कुछ का उपयोग क्यों नहीं कर रहे हैं IO :: कंप्रेस :: Gzip, मुझ पर भरोसा करें, मैंने इसके बारे में सोचा है)। कम्प्रेशन कमांड स्वयं एक कॉन्फ़िगरेशन फ़ाइल में संग्रहीत है। आपकी बाद की कमान मुझे जो चाहिए, उसके करीब लगती है, लेकिन मुझे लगता है कि मुझे कुछ ऐसा मिला है, जो मेरी जरूरतों को थोड़ा बेहतर बनाएगा। मैं आपके उत्तर को स्वीकार करने जा रहा हूं, क्योंकि यह मेरा एक बेहतर सामान्य समाधान है, लेकिन जो मैं वास्तव में उपयोग करने जा रहा हूं, उसके लिए नीचे देखें।
बार्टन चित्तेंडेन

आप पर्ल में एक फ़ाइल पा सकते हैं ...
ларослав Рахматуллин

1
मैं स्पष्ट नहीं हूँ कि आपका क्या मतलब है poke a file
बार्टन चित्तेंडेन

अमेरिकी अंग्रेजी में रोजमर्रा के संचार में सहयोग / छवि का अभाव मुझे हर बार आश्चर्यचकित करता है :) मुझे कोशिश करने और समझाने की अनुमति दें। यह देखने के लिए कि क्या यह जीवित है या क्या नहीं, छड़ी के साथ एक मृत कौवा को पोछते हुए बच्चे की एक छवि तैयार करें। यहां विशेषताओं के लिए जांच के लिए पोकिंग का उपयोग किया जाता है। इसी तरह, किसी फ़ाइल को पोक करने का मतलब उसके बारे में कुछ जांचना होगा, जैसे कि यह सभी मौजूद है। किसी भी दर पर, मुझे लगता है कि पोकिंग का कार्य बहुत ही कम से कम "बाहरी वस्तु के साथ संपर्क प्राप्त करना" होना चाहिए , और यह कहने के लिए पर्याप्त है " छवि के बारे में कुछ जानकारी प्राप्त करें" एक छवि के साथ, इसे वर्तनी के बजाय।
Ярослав Рахматуллин

"पोक" अक्सर मेमोरी लोकेशन सेट करने के लिए हैकर स्लैंग होता है। देखें: en.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
बिल मैकगोनिग

12

निकटतम चीज़ जो मुझे एक कमांड में मिल सकती है वह निम्नलिखित है:

yes n | gzip archive/foo

yesआदेश प्रिंट yजब तक यह एक संकेत प्राप्त एक linefeed के बाद stdout करने के लिए। यदि इसका कोई तर्क है, तो यह इसके बजाय मुद्रित करेगा y। इस मामले में, यह nतब तक प्रिंट करता है जब तक कि गज़िप बाहर नहीं निकल जाता है, इस प्रकार पाइप को बंद कर देता है।

यह nकीबोर्ड पर बार-बार प्रवेश करने के बराबर है ; यह स्वचालित रूप से प्रश्न का उत्तर देगाgzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

मैं सामान्य तौर पर, मुझे लगता है कि यदि संगत gzipped फ़ाइल मौजूद है, तो फ़ाइलों को संपीड़ित करने का प्रयास न करना बेहतर है; मेरा समाधान noisier है, लेकिन यह gzipएक विन्यास फाइल में बैठे कमांड के लिए ड्रॉप-इन प्रतिस्थापन के लिए मेरी विशेष आवश्यकताओं को फिट करता है।


1
इसके साथ एक और झुंझलाहट यह है कि gzipबाहर निकलता है2
स्टीवन पेनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.