Gzip, но исключая некоторые файлы каталогов и также добавляя текущую дату

Я ищу способ создать файл .tar.gz из каталога, но у меня есть некоторые сомнения. Я знаю, что команда для создания файла:

 tar -zcvf /path/to/compressed/file.tar.gz /path/to/compress 

И тогда я получу file.tar.gz но это сохранит путь к исходным источникам. Так вот что я ищу:

  • Должен быть сжат как .tar.gz
  • Если это возможно, не следует поддерживать путь к сжатому каталогу, я имею в виду, мне нужен только каталог сжатия и его содержимое. Если я распакую файл под Windows, например, я получу /path[folder]/to[folder]/compress[folder+content] и я просто хочу, чтобы последние
  • Если возможно, я могу опустить некоторые каталоги? Пример. Мне нравится сжимать app/ папку, а его содержимое:

     drwxrwxr-x 6 ubuntu ubuntu 4096 Feb 24 14:48 ./ drwxr-xr-x 10 ubuntu ubuntu 4096 Feb 26 22:33 ../ -rw-rw-r-- 1 ubuntu ubuntu 141 Jan 29 06:07 AppCache.php -rw-rw-r-- 1 ubuntu ubuntu 2040 Feb 24 14:48 AppKernel.php -rw-rw-r-- 1 ubuntu ubuntu 267 Jan 29 06:07 autoload.php -rw-r--r-- 1 root root 94101 Feb 19 21:09 bootstrap.php.cache drwxrwxrwx 4 ubuntu ubuntu 4096 Feb 25 16:44 cache/ -rw-rw-r-- 1 ubuntu ubuntu 3958 Feb 24 14:48 check.php drwxrwxr-x 2 ubuntu ubuntu 4096 Feb 24 14:48 config/ -rwxrwxr-x 1 ubuntu ubuntu 867 Jan 29 06:07 console* -rw-rw-r-- 1 ubuntu ubuntu 6148 Jan 29 06:07 .DS_Store -rw-rw-r-- 1 ubuntu ubuntu 143 Jan 29 06:07 .htaccess drwxrwxrwx 2 ubuntu ubuntu 4096 Feb 24 14:48 logs/ -rw-rw-r-- 1 ubuntu ubuntu 1118 Jan 29 06:07 phpunit.xml.dist drwxrwxr-x 5 ubuntu ubuntu 4096 Jan 29 06:07 Resources/ -rw-rw-r-- 1 ubuntu ubuntu 30404 Feb 24 14:48 SymfonyRequirements.php 

    Но я хочу оставить cache/ , logs/ каталоги и файл bootstrap.php.cache , как? Это возможно?

  • Мне нужно добавить текущую дату (DD / MM / YYYY-H: M: S) к имени файла, как?

Могу я посоветовать или помочь? Я планирую добавить это к скрипту Bash, чтобы он работал как сценарий bash, а не как командная строка

Обновление: тестирование внутри скрипта

Следуя предложению @Ariel, я добавил эту строку в сценарий bash:

 read -e -p "Enter the directory to compress: " -i "/var/www/html/" directory read -e -p "Enter the filename: " filename FILENAME = "$filename-`date +%d-%m-%Y-%X`.tgz" cd "$directory" tar -zcvf /home/$FILENAME --exclude cache --exclude logs --exclude bootstrap.php.cache --exclude composer.lock --exclude vendor 

Но я получаю эту ошибку:

 Enter the directory to compress: /var/www/html/lynxoft/apps/checkengine/ Enter the filename: checkengine /usr/local/bin/script-task: line 109: FILENAME: command not found tar: Cowardly refusing to create an empty archive 

Почему FILENAME рассматривается как команда, а не как var, как говорят документы ?

Обновление 2: все еще сжатие всего пути

Я исправил некоторые проблемы, благодаря комментариям пользователей и строкам сценария выглядит так:

 read -e -p "Enter the directory to compress: " -i "/var/www/html/" directory read -e -p "Enter the filename: " filename FILENAME="$filename"-$(date +%d-%m-%Y-%T).tgz cd "$directory/.." tar -zcvf /home/$FILENAME "$directory" --exclude="*cache*" --exclude=logs --exclude=bootstrap.php.cache --exclude=composer.lock --exclude=vendor --exclude=.git 

Единственная оставшаяся проблема заключается в том, что сжатый файл все еще имеет весь путь, а не только конечный каталог. Например:

 Enter the directory to compress: /var/www/html/lynxoft/apps/checkengine/ Enter the filename: file 

Это результат в file-28-02-2015-17:44:32.tgz но содержимое внутри сжатого файла все еще имеет весь путь /var/www/html/lynxoft/apps/checkengine/ , почему?

2 Solutions collect form web for “Gzip, но исключая некоторые файлы каталогов и также добавляя текущую дату”

Просто cd в папку, откуда вы хотите, чтобы структура tarball tress начиналась, и используйте относительные пути! Так, например:

 # Note, one folder above cd /path/to/compress/.. # Tell tar to compress the relative path tar -zcvf /path/to/compressed/file.tar.gz compress 

Когда вы распакуете его, он создаст папку compress в текущем рабочем каталоге.

Вы можете исключить файлы или папки с помощью опции --exclude <PATTERN> и добавить дату в имя файла с date +FORMAT , например:

 FILENAME="file-`date +%d-%m-%Y-%T`.tgz" tar -zcvf /path/to/compressed/$FILENAME --exclude cache --exclude logs --exclude bootstrap.php.cache compress 

С gnu tar вы можете использовать:

 --transform=EXPRESSION, --xform=EXPRESSION Use sed replace EXPRESSION to transform file names. 

что означает --xform='s|path/to/||' удалит path/to/ из пути;
а также

 --exclude=PATTERN Exclude files matching PATTERN, a glob(3)-style wildcard pattern. 

поэтому вы можете запустить:

 tar -zcvf /path/to/compressed/"$(date +%d-%m-%Y-%T)"-testdir.tar.gz \ --transform='s|^path/to/||' /path/to/compress \ --exclude='cache' --exclude='logs' --exclude='bootstrap.php.cache' 

Обратите внимание, что в выражении, используемом с xform . Более общий подход:

 --xform='s|^([^/]*/){2}||x' 

Это разделило бы первые два элемента пути (замените 2 другим числом – по мере необходимости).

  • Со временем степень сжатия gz улучшается?
  • pv (индикатор выполнения) и gzip
  • почему я должен использовать tar.xz вместо tar.gz? xz - программа сжатия данных без потерь и формат файла
  • Я случайно GZIPed целую кучу файлов, один за другим, вместо использования tar (1). Как я могу отменить этот беспорядок?
  • Как gzip и копировать файлы, сохраняя свою структуру каталогов?
  • Невозможно прочитать или распаковать определенные архивы на одном конкретном сервере
  • Wget возвращает двоичный файл вместо html?
  • gunzip несколько сжатых файлов в другой каталог, не удаляя файлы .gz
  • разархивировать файл из другой папки
  • Самый быстрый способ разработки несжатого размера большого файла GZIPPED
  • Добавить временную метку при записи файла
  • Объединение, сортировка и удаление дубликатов в многочисленных файлах gzip
  • Linux и Unix - лучшая ОС в мире.