มีวิธีบังคับ gzip ไม่ให้เขียนทับไฟล์ที่มีข้อขัดแย้งหรือไม่?


17

ฉันกำลังเขียนสคริปต์ที่ฉันกำลัง gzipping ไฟล์

มีความเป็นไปได้ที่ฉันอาจ zip ไฟล์สร้างไฟล์ที่มีชื่อเดียวกันและลอง gzip นี้เช่นกัน

$ 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ดูเหมือนจะไม่มีสวิตช์บรรทัดคำสั่งบังคับให้ gzip ปล่อย.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
Bill McGonigle

1
@BillMcGonigle ความคิดเห็นของคุณควรเป็นคำตอบ!
Rockallite

คำตอบ:


9

มันได้ dawned กับฉันว่าวิธีที่ดีที่สุดเพื่อหลีกเลี่ยงผลกระทบที่ไม่พึงประสงค์คือการไม่ได้ขอให้โปรแกรมทำงานในลักษณะที่ไม่ต้องการ นั่นคืออย่าบอกให้บีบอัดไฟล์หากไฟล์นั้นมีอยู่แล้วในรูปแบบที่บีบอัด

เช่น:

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

หรือสั้นกว่า (เรียกใช้trueหากมีไฟล์.gzบีบอัดไฟล์เป็นอย่างอื่น)

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

น่าเสียดายที่สิ่งนี้กำลังถูกเรียกใช้เป็นคำสั่งระบบภายในสคริปต์ perl (เรื่องยาวเกี่ยวกับสาเหตุที่เราไม่ได้ใช้อะไรอย่าง IO :: Compress :: Gzip เชื่อฉันสิฉันคิดเรื่องนี้) คำสั่งการบีบอัดตัวเองจะถูกเก็บไว้ในไฟล์การกำหนดค่า คำสั่งหลังของคุณดูใกล้เคียงกับสิ่งที่ฉันต้องการ แต่ฉันคิดว่าฉันได้พบสิ่งที่จะตอบสนองความต้องการของฉันได้ดีขึ้นเล็กน้อย ฉันจะยอมรับคำตอบของคุณเพราะมันเป็นคำตอบทั่วไปที่ดีกว่าของฉัน แต่ดูด้านล่างสำหรับสิ่งที่ฉันจะใช้จริง
Barton Chittenden

คุณสามารถกระตุ้นไฟล์ใน Perl ...
ЯрославРахматуллин

1
poke a fileฉันไม่ได้ล้างสิ่งที่คุณหมายถึงโดย
Barton Chittenden

การขาดการเชื่อมโยง / ภาพในการสื่อสารประจำวันในภาษาอังกฤษแบบอเมริกันทำให้ฉันประหลาดใจทุกครั้ง :) ให้ฉันลองอธิบาย คิดรูปเด็กที่ยื่นอีกาที่ตายแล้วด้วยไม้เพื่อดูว่ามันมีชีวิตอยู่หรือไม่ Pokingใช้สำหรับตรวจสอบแอททริบิวที่นี่ ในทำนองเดียวกันการpoking ไฟล์จะหมายถึงการตรวจสอบบางอย่างเกี่ยวกับมันเช่นถ้ามันเป็นปัจจุบัน ไม่ว่าในกรณีใดก็ตามฉันรู้สึกว่าการสอดแนมควรอย่างน้อยที่สุดหมายความว่า"ได้รับการติดต่อกับวัตถุภายนอก"และนั่นก็เพียงพอแล้วที่จะพูดว่า"รับข้อมูลบางอย่างเกี่ยวกับไฟล์"ด้วยรูปภาพแทนที่จะสะกดออกมา
ЯрославРахматуллин

"poke" มักแฮ็กเกอร์แสลงสำหรับตั้งค่าตำแหน่งหน่วยความจำ ดู: en.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
Bill McGonigle

12

สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้จากคำสั่งเดียวคือ:

yes n | gzip archive/foo

yesพิมพ์คำสั่งyตามด้วยการเลื่อนบรรทัดเพื่อ stdout จนกว่าจะได้รับสัญญาณ yหากมีข้อโต้แย้งก็จะพิมพ์ที่แทน ในกรณีนี้มันจะพิมพ์nจนกว่า gzip จะออกจึงปิดท่อ

นี่เทียบเท่ากับการป้อนnซ้ำ ๆ บนคีย์บอร์ด; สิ่งนี้จะตอบคำถามโดยอัตโนมัติgzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

โดยทั่วไปฉันคิดว่าเป็นการดีกว่าที่จะไม่บีบอัดไฟล์หากมีไฟล์ gzipped ที่เกี่ยวข้องอยู่; วิธีการแก้ปัญหาของฉันคือ noisier แต่มันเหมาะกับความต้องการเฉพาะของฉันสำหรับการแทนที่สำหรับgzipคำสั่งโดยอยู่ในไฟล์กำหนดค่า


1
สิ่งที่น่ารำคาญก็คือgzipทางออกนี้2
Steven Penny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.