Команда оболочки для каталога tar, исключая определенные файлы / папки - PullRequest
691 голосов
/ 12 июня 2009

Существует ли простая команда / скрипт оболочки, которая поддерживает исключение определенных файлов / папок из архива?

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

Не совсем решения:

Команда tar --exclude=PATTERN соответствует заданному шаблону и исключает эти файлы, но мне нужно игнорировать определенные файлы и папки (полный путь к файлу), в противном случае допустимые файлы могут быть исключены.

Я также мог бы использовать команду find, чтобы создать список файлов и исключить те, которые я не хочу архивировать, и передать список в tar, но это работает только для небольшого количества файлов. У меня десятки тысяч.

Я начинаю думать, что единственное решение - создать файл со списком исключаемых файлов / папок, затем использовать rsync с --exclude-from=file, чтобы скопировать все файлы в каталог tmp, а затем использовать tar для заархивируйте этот каталог.

Кто-нибудь может придумать лучшее / более эффективное решение?

РЕДАКТИРОВАТЬ: Решение Чарльза Ма работает хорошо. Главное, что --exclude='./folder' ДОЛЖЕН находиться в начале команды tar. Полная команда (сначала cd, поэтому резервное копирование относится к этому каталогу):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

Ответы [ 24 ]

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

Вы можете иметь несколько опций исключения для tar, так что

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

и т. Д. Будет работать. Сделайте уверенным , чтобы поставить --exclude перед исходным и целевым элементами.

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

Вы можете исключить каталоги с --exclude для tar.

Если вы хотите заархивировать все, кроме /usr, вы можете использовать:

tar -zcvf /all.tgz / --exclude=/usr

В вашем случае возможно что-то вроде

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
53 голосов
/ 08 ноября 2012

Возможные варианты исключения файлов / каталогов из резервной копии с использованием tar:

Исключить файлы, используя несколько шаблонов

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

Исключить файлы, используя исключаемый файл, заполненный списком шаблонов

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

Исключить файлы с помощью тегов, поместив файл тегов в любой каталог, который следует пропустить

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
41 голосов
/ 08 мая 2014

старый вопрос со многими ответами, но я обнаружил, что ни один не был достаточно ясен для меня, поэтому я хотел бы добавить свою попытку.

если у вас следующая структура

/home/ftp/mysite/

со следующими файлами / папками

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

Итак, вы хотите создать tar-файл, содержащий все внутри / home / ftp / mysite (чтобы переместить сайт на новый сервер), но file3 просто мусор, и все в folder3 также не нужно, поэтому мы пропустим эти два.

мы используем формат

tar -czvf <name of tar file> <what to tar> <any excludes>

, где c = create, z = zip и v = verbose (вы можете видеть файлы по мере их ввода, полезно, чтобы убедиться, что ни один из исключаемых вами файлов не добавляется). и f = файл.

Итак, моя команда будет выглядеть так

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

обратите внимание, что исключенные файлы / папки относятся к корню вашего tar (здесь я пробовал полный путь относительно /, но я не могу заставить это работать).

надеюсь, это кому-нибудь поможет (и мне в следующий раз, когда я буду гуглить)

17 голосов
/ 14 мая 2015

Вы можете использовать стандартную «муравьиную нотацию» для исключения относительных каталогов.
Это работает для меня и исключает любые каталоги .git или node_module.

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt Содержит:

/ DEV2 / Java
/ DEV2 / JavaScript

16 голосов
/ 31 декабря 2013

Я испытал это, по крайней мере с Cygwin версией tar, которую я использую ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin "на компьютере с Windows XP Home Edition SP3), порядок опций важен.

Пока эта конструкция у меня работала:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

этот не работал:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

Это, тогда как tar --help показывает следующее:

tar [OPTION...] [FILE]

Итак, вторая команда также должна работать, но, похоже, это не так ...

Лучшие ргдс,

12 голосов
/ 12 февраля 2015

Этот шаблон исключения обрабатывает суффикс имени файла, такой как png или mp3, а также имена каталогов, такие как .git и node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
10 голосов
/ 06 февраля 2010

Я нашел это где-то еще, так что я не буду брать кредит, но он работал лучше, чем любое из вышеупомянутых решений для моих проблем, связанных с Mac (даже если это закрыто):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
9 голосов
/ 18 апреля 2018

Для тех, у кого есть проблемы с этим, некоторые версии tar будут работать правильно только без './' в значении exclude.

Tar --version

tar (GNU tar) 1.27.1

Синтаксис команды, которая работает:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

Это не будет работать:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *
7 голосов
/ 06 мая 2017

Для Mac OSX мне пришлось сделать

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

Обратите внимание на -f после --exclude=

...