Команда Linux tar: сжатие каталога, но исключение подкаталогов
Сценарий: У меня есть каталог на сервере, на котором размещен мой веб-сайт, содержащий сотни изображений, отправленных пользователями. Я создаю сценарий резервного копирования, который берет все изображения из каталога и сжимает их в одно.tar.gz файл. Команда, которая у меня есть до сих пор, такова:
тар -ЧЦПФ/path/to/backups/my_backup.tar.gz путь/к/изображениям/
Проблема: Нет внутри моего пути/к/изображениям/ У меня есть каталог под названием tmp/. Когда я выполняю команду, я получаю.tar.gz файл, содержащий все изображения в каталоге path/to/images/ и подкаталоге с именем tmp/.
Вопрос: Как я могу заставить команду пропустить/не включать подкаталог tmp/ в.tar.gz файл.
Заранее огромное спасибо.
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
обязательно указывайте параметр ШАБЛОНА , чтобы GNUtar
видел подстановочные знаки, такие как*
. Если вы этого не сделаете, оболочка может расширить*
, используя имеющиеся файлы , поэтомуtar
может получить список файлов вместо одного шаблона или вообще без него, что делает команду несколько незаконной. Это может не соответствовать тому, что вы хотите.
Например, напишите:
$ tar -c -f ARCHIVE.TAR --exclude '*.o' DIRECTORY
Вместо:
$ tar -c -f ARCHIVE.TAR --exclude *.o DIRECTORY
- При использовании параметров исключения в
tar
необходимо использовать синтаксис оболочки или глобализацию, а не синтаксисregexp
. Если вы попытаетесь использоватьregexp
синтаксис для описания файлов, подлежащих исключению, ваша команда может завершиться ошибкой.
tar -czpf /path/to/backups/my_backup.tar.gz --exclude path/to/images/tmp path/to/images/
Это должно сработать (при условии, что GNU tar):
tar -czpf /path/to/backups/my_backup.tar.gz --exclude=tmp path/to/images/