Команда tar в Linux: сжатие каталога, но исключая подкаталоги - PullRequest
5 голосов
/ 27 июня 2009

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

tar -czpf /path/to/backups/my_backup.tar.gz path / to / images /

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

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

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

Ответы [ 3 ]

12 голосов
/ 27 июня 2009

Вы ищете аргумент --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
  • Вы должны использовать использовать синтаксис оболочки или globbing вместо regexp синтаксис, при использовании параметров исключения в tar. Если вы попытаетесь использовать regexp синтаксис для описания файлов, которые нужно исключить, ваша команда может потерпеть неудачу.
3 голосов
/ 27 июня 2009
tar -czpf /path/to/backups/my_backup.tar.gz --exclude path/to/images/tmp path/to/images/
0 голосов
/ 27 июня 2009

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

tar -czpf /path/to/backups/my_backup.tar.gz --exclude=tmp path/to/images/
...