Есть у меня один файл, который я периодически бэкаплю, при этом не затирая старые бэкапы. Очень редко, но бывает, что мне нужно сравнивать текущий файл с файлом из бэкапа за какое-нибудь число, поэтому я спокойно его разархивирую и сравниваю. Допустим, файл у меня filename.ext, а бэкапы я делаю вида filename-2010-12-09.zip, filename-2011-02-14.zip (zip – потому что начинал это делать ещё в windows). Но тут, вдруг, мне понадобилось разархивировать и сравнить около 30 файлов.
Проблема в том, что имя файла в архиве одинаковое, разные только сами имена у архивов, и если их разархивировать, то новый распаковываемый файл будет перезаписывать предыдущий, либо просить ввести имя файла, а вручную мне писать имя 30 файлам не хотелось. Можно бы было использовать команду
unzip -B \*.zip
но тогда бы у меня получались файлы filename.ext~, filename.ext~1, filename.ext~2 и т.д., а мне всё же нужна была дата в имени файла.
В итоге сделал себе вот такой скрипт:
for file in `find . -type f -name \*.zip`; do mv `zipout=$(unzip $file);echo $zipout | sed -e 's/Archive:\s*\(.*\).zip\s*inflating:\s*\(.*\)/\2 \1.ext/g'`; done
Он даёт такое же имя распаковываемому файлу, какое было у архива. В результате его работы у меня получились файлы filename-2010-12-09.ext, filename-2011-02-14.ext и т.д.
Немного о том, как он работает. Вот пример успешной распаковки архива командой unzip:
user@host:~$ unzip filename-2010-12-09.zip Archive: filename-2010-12-09.zip inflating: filename.ext
Две нижние строки нужно передать в sed, но он работает построчно, поэтому я результат вывожу через echo, тогда получается одна строка, и дальше sed её разбирает, и выполняется команда переименовывания mv filename.ext filename-2010-12-09.ext. Ну и всё это делается для каждого .zip файла в текущей директории.
Следует учесть, что он захардкожен только для одного файла в архиве. У меня была именно такая ситуация, поэтому универсальным его не делал. Если в архиве будет несколько файлов, то будет несколько строк с inflating, а если в архиве ещё будут другие .zip архивы, то вместо inflating будет extracting.
P.S. Я знаю про системы управления версиями и пользуюсь ими, но тут другой случай.