Чи є спосіб змусити gzip не перезаписувати файли на конфлікт?


17

Я пишу сценарій, в якому я gzipping файли.

Існує можливість, що я можу зібрати файл, створити файл з тим самим іменем і спробувати згорнути це, наприклад,

$ 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 перевіряє наявність фонового режиму, але додавання "&" у bash до системи, над якою я працюю, не робить цього. Перебуваючи з іншого боку труби, здається, працює, але замість цього: 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 У вашому коментарі має бути відповідь!
Rockallite

Відповіді:


9

Мені стало зрозуміло, що найкращий спосіб уникнути небажаного ефекту - це не вимагати від програми виконання небажаного ефекту. Тобто просто не кажіть йому стискати файл, якщо файл вже присутній у стислому вигляді.

наприклад:

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 використовується для зондування атрибутів тут. Аналогічно, натикати файл означатиме перевірити щось про нього, наприклад, якщо він взагалі присутній. У будь-якому випадку, я вважаю, що дія тикання повинен принаймні означати "досягти контакту із зовнішнім об'єктом" , і цього достатньо, щоб сказати "отримати деяку інформацію про файл" із зображенням, а не писати його.
Ярослав Рахматуллін

"poke" часто є хакерським сленгом для встановлення місця пам'яті. Дивіться: en.wikipedia.org/wiki/PEEK_and_POKE#Generic_usage_of_.22POKE.22
Білл МакГонігле

12

Найближче, що я міг знайти для однієї команди, це:

yes n | gzip archive/foo

У yesкоманді друкує з yподальшим переведенням рядком на стандартний висновок до тих пір, поки не отримає сигнал. Якщо у нього є аргумент, він надрукує це замість y. У цьому випадку він друкує nдо виходу gzip, закриваючи таким чином трубу.

Це еквівалент nповторного введення на клавіатурі; це автоматично відповість на питанняgzip: archive/foo.gz already exists; do you wish to overwrite (y or n)?

Я взагалі вважаю, що краще не намагатися стискати файли, якщо існує відповідний gzipped файл; моє рішення шумніше, але воно відповідає моїм конкретним потребам у замінній gzipкоманді, що знаходиться у файлі конфігурації.


1
Ще одна неприємність з цього gzipприводу виходить2
Стівен Пенні,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.