Работа с архивами в UNIX-системах

Автор: | 21 августа 2009

При резервирном копировании, переносе данных и ротации логов, очень полезным было и остается архивирование. Стандартными для UNIX-систем де-факто были и остаются архиваторы tar, gzip и bzip (bzip2).

Краткий справочник, как ими управлять:

tar  cf file.tar files – создать tar-архив с именем file.tar содержащий files
tar  xf file.tar – распаковать file.tar
tar zcf file.tar.gz files – создать архив tar с сжатием Gzip
tar zxf file.tar.gz – распаковать tar с Gzip
tar jcf file.tar.bz2 – создать архив tar с сжатием Bzip2
tar jxf file.tar.bz2 – распаковать tar с Bzip2
gzip file – сжать file и переименовать в file.gz
gzip -k file – сжать file в file.gz и оставить file
gzip -d file.gz – разжать file.gz в file
gunzip file.gz – разжать file.gz в file
gzip -c file.gz - разжать файл и вывести в stdout
gzcat file.gz - разжать файл и вывести в stdout
на самом деле gunzip и gzcat - хардлинки на gzip,
~> ls -laio /usr/bin/gzcat /usr/bin/gunzip /usr/bin/gzip
47132 -r-xr-xr-x  4 root  wheel  - 28400 Mar  6  2008 /usr/bin/gunzip
47132 -r-xr-xr-x  4 root  wheel  - 28400 Mar  6  2008 /usr/bin/gzcat
47132 -r-xr-xr-x  4 root  wheel  - 28400 Mar  6  2008 /usr/bin/gzip
просто так проще, чтобы не запоминать ключи :)
с bzip2 все аналогично gzip:
bzip2 file – сжать file и переименовать в file.bz2
bzip2 -k file – сжать file в file.gz2 и оставить file
bunzip2 file.bz2 – разжать file.bz2 в file
bzcat file.bz2 - разжать файл и вывести в stdout

bzcat/gzcat очень полезно применять, когда нужно прочитать уже сротированный лог, например:

bzcat /var/log/auth.log.6.bz2 | less

Архиватор rar содержит великое множество ключей, самые распространенные:

rar a 1.rar 1.txt q - добавить в архив 1.rar файл 1.txt и каталог q
rar a 2.rar 1.txt q/ - добавить в архив 2.rar файл 1.txt и каталог q,
не добавляя имя каталога в архив
rar e 1.rar - распаковать все файлы в текущий каталог
rar x 1.rar - распаковать файлы в текущий каталог, сохраняя структуру каталогов
rar p -inul 1.rar - вывести все файлы архива в stdout
rar vb 1.rar - показать список файлов в архиве
 
~> rar a 1.rar 1.txt q/
Creating archive 1.rar
Adding    1.txt                                                       OK
Adding    q/4.txt                                                     OK
Done
 
~> rar vb 1.rar
1.txt
q/4.txt
 
~> rar a 2.rar 1.txt q
Creating archive 2.rar
Adding    1.txt                                                       OK
Adding    q/4.txt                                                     OK
Adding    q                                                           OK
Done
 
 ~> rar vb 2.rar
1.txt
q/4.txt
q

Пример с архиватором zip:

zip a.zip d.txt - добавить в архив a.zip файл d.txt
unzip -ql a.zip - вывести список файлов архива a.zip
unzip a.zip - распаковать архив a.zip
unzip a.zip -d files - распаковать архив a.zip в каталог files

Скрипт для рекурсивной распаковки всех файлов текущего каталога, при условии, что если в архиве файлы содержатся не в каталоге, то создается каталог с именем архива:

# unzipper.sh
# ver. 0.3 (c) NetSpider
#!/bin/sh

cwd=`pwd`

zipfiles=`find $cwd -name \*.zip`

for zf in ${zipfiles}
do
  unzipdir=`echo $zf | sed 's/\.zip//g'`
  indirname=`unzip -ql $zf | grep "/" | head -1 | awk '{print $4}'`
  adfile=`unzip -ql $zf | egrep -v "/|--|Length" | head -1 | awk '{print $4}'`

echo

  if [ -z $indirname ]
  then
    unzip $zf -d $unzipdir
  else
    if [ -z $adfile ]
    then
      unzip $zf
    else
      unzip $zf -d $unzipdir
    fi
  fi
done

Добавить комментарий