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/ , почему?

  • как написать команду dd для замены резервной копии корневого раздела?
  • Bash: использование двухсторонних перенаправлений в сценарии оболочки
  • зеркало сайта с wget, что только ответ с gzip
  • переносная команда для распаковки и распаковки без GNU и старого unix
  • лучший способ разделить огромные файлы на основе поля, когда awk слишком медленный
  • Как искать текст в сжатых файлах и получать только имя файла
  • Используйте gzip для сжатия файлов в каталоге, кроме уже существующих .gz-файлов
  • Как использовать gunzip и tar для извлечения моего файла tar.gz в конкретный каталог, который я хочу?
  • 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 другим числом – по мере необходимости).

    Linux и Unix - лучшая ОС в мире.