Команда Linux tar: сжатие каталога, но исключение подкаталогов


Сценарий: У меня есть каталог на сервере, на котором размещен мой веб-сайт, содержащий сотни изображений, отправленных пользователями. Я создаю сценарий резервного копирования, который берет все изображения из каталога и сжимает их в одно.tar.gz файл. Команда, которая у меня есть до сих пор, такова:

тар -ЧЦПФ/path/to/backups/my_backup.tar.gz путь/к/изображениям/

Проблема: Нет внутри моего пути/к/изображениям/ У меня есть каталог под названием tmp/. Когда я выполняю команду, я получаю.tar.gz файл, содержащий все изображения в каталоге path/to/images/ и подкаталоге с именем tmp/.

Вопрос: Как я могу заставить команду пропустить/не включать подкаталог tmp/ в.tar.gz файл.

Заранее огромное спасибо.

Author: VinkoCM, 2009-06-27

3 answers

Вы ищете аргумент --exclude.

--exclude=PATTERN

Некоторые пользователи находят параметры exclude запутанными. Вот некоторые распространенные подводные камни:

  • Основной режим работы tar не действует на имя пути , явно указанное в командной строке, если исключен один из компонентов имени файла. В приведенном выше примере, если вы создадите архив и исключите файлы, которые заканчиваются на *.o, но явно назовете файл dir.o/foo после того, как все параметры будут перечислены, dir.o/foo будет исключен из архива.

  • Иногда вы можете путать значения --exclude=PATTERN и --exclude-from=FILE-OF-PATTERNS (-X FILE-OF-PATTERNS). Будьте осторожны: используйте --exclude=PATTERN, когда файлы, подлежащие исключению , задаются в командной строке в виде шаблона. Используйте --exclude-from=FILE-OF-PATTERNS, чтобы ввести имя файла , который содержит список шаблонов, по одному на строку; каждый из этих шаблонов может исключать ноль, один или несколько файлов.

  • При использовании --exclude=PATTERN обязательно указывайте параметр ШАБЛОНА , чтобы GNU tar видел подстановочные знаки, такие как *. Если вы этого не сделаете, оболочка может расширить *, используя имеющиеся файлы , поэтому tar может получить список файлов вместо одного шаблона или вообще без него, что делает команду несколько незаконной. Это может не соответствовать тому, что вы хотите.

Например, напишите:

$ tar -c -f ARCHIVE.TAR --exclude '*.o' DIRECTORY

Вместо:

$ tar -c -f ARCHIVE.TAR --exclude *.o DIRECTORY
  • При использовании параметров исключения в tar необходимо использовать синтаксис оболочки или глобализацию, а не синтаксис regexp . Если вы попытаетесь использовать regexp синтаксис для описания файлов, подлежащих исключению, ваша команда может завершиться ошибкой.
 12
Author: jason, 2012-04-30 19:01:12
tar -czpf /path/to/backups/my_backup.tar.gz --exclude path/to/images/tmp path/to/images/
 3
Author: chaos, 2009-06-27 15:50:09

Это должно сработать (при условии, что GNU tar):

tar -czpf /path/to/backups/my_backup.tar.gz --exclude=tmp path/to/images/
 0
Author: legoscia, 2009-06-27 15:51:28