Существует ли простая команда / скрипт оболочки, которая поддерживает исключение определенных файлов / папок из архива?
У меня есть каталог, который должен быть заархивирован с подкаталогом, содержащим несколько очень больших файлов, которые мне не нужно резервировать.
Не совсем решения:
Команда 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 .
--exclude
не обязательно должен быть первым, но он должен находиться где-то перед исходным каталогом (протестировано с tar 1.29 на Cygwin).Ответы:
Вы можете иметь несколько опций исключения для tar, так
и т. д. будет работать. Убедитесь, что поставили
--exclude
перед отправителем и пунктом назначения.источник
tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz .
обратите внимание, что-f
флаг должен предшествовать tar-файлу, смотрите: superuser.com/a/559341/415047Вы можете исключить каталоги с помощью
--exclude
tar.Если вы хотите заархивировать все, кроме
/usr
вы можете использовать:В вашем случае возможно что-то вроде
источник
Возможные варианты исключения файлов / каталогов из резервной копии с помощью tar:
Исключить файлы, используя несколько шаблонов
Исключить файлы, используя исключаемый файл, заполненный списком шаблонов
Исключите файлы с помощью тегов, поместив файл тегов в любой каталог, который следует пропустить
источник
старый вопрос с множеством ответов, но я обнаружил, что ни один из них не был достаточно ясен для меня, поэтому я хотел бы добавить свою попытку.
если у вас есть следующая структура
со следующими файлами / папками
Итак, вы хотите создать tar-файл, который содержит все внутри / home / ftp / mysite (чтобы переместить сайт на новый сервер), но
file3
это просто мусор, и все в немfolder3
также не нужно, поэтому мы пропустим эти два.мы используем формат
где c = create, z = zip и v = verbose (вы можете видеть файлы по мере их ввода, полезно, чтобы убедиться, что ни один из исключаемых вами файлов не добавляется). и f = файл.
Итак, моя команда будет выглядеть так
обратите внимание, что исключенные файлы / папки относятся к корню вашего tar (здесь я пробовал полный путь относительно /, но я не могу заставить это работать).
надеюсь, это поможет кому-то (и мне в следующий раз, когда я погуглю)
источник
tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'
, и это ничего не исключало.Вы можете использовать стандартную «муравьиную нотацию» для исключения относительных каталогов.
Это работает для меня и исключает любые каталоги .git или node_module:
myInputFile.txt содержит:
/ dev2 / java
/ dev2 / javascript
источник
globstar
была включена. Проверьте сshopt -s globstar
. Я думаю , что это от по умолчанию на большинстве Unix на основе ОС. Из руководства Bash: « globstar: если установлено, шаблон,**
используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулю или более каталогов и подкаталогов. Если за шаблоном следуетЯ испытал это, по крайней мере, с версией 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 machine), порядок опций важен.
Пока эта конструкция у меня работала
тот не работал
Это пока
tar --help
раскрывает следующее:Итак, вторая команда также должна работать, но, похоже, это не так ...
Лучшие ргдс,
источник
Этот шаблон исключения обрабатывает суффикс имени файла, такой как png или mp3, а также имена каталогов, такие как .git и node_modules
источник
Для тех, у кого есть проблемы с этим, некоторые версии tar будут работать только без './' в значении exclude.
Синтаксис команды, которая работает:
Это не будет работать:
источник
Я нашел это где-то еще, так что я не буду брать кредит, но это работало лучше, чем любое из решений выше для моих проблем, связанных с Mac (даже если это закрыто):
источник
COPYFILE_DISABLE=1
при использовании tar, в противном случае вы можете получить ._ файлы в своем архивеДля Mac OSX мне пришлось сделать
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Обратите внимание на
-f
после--exclude=
источник
Я согласен, что флаг --exclude является правильным подходом.
Слово с предупреждением о побочном эффекте, который я не нашел сразу очевидным: исключение «fileA» в этом примере будет искать «fileA» РЕКУРСИВНО !
Пример: каталог с одним подкаталогом, содержащий файл с тем же именем (data.txt)
При использовании
--exclude='data.txt'
архива не будет содержать ЯВНО data.txt файл. Это может привести к неожиданным результатам при архивировании сторонних библиотек, таких как каталог node_modules.Чтобы избежать этой проблемы, обязательно укажите весь путь, например,
--exclude='./dirA/data.txt'
источник
Чтобы избежать возможных
'xargs: Argument list too long'
ошибок из-за использованияfind ... | xargs ...
при обработке десятков тысяч файлов, вы можете направить выводfind
непосредственно вtar
использованиеfind ... -print0 | tar --null ...
.источник
xargs -n 1
это еще один вариант, чтобы избежатьxargs: Argument list too long
ошибки;)Прочитав эту ветку, я провел небольшое тестирование на RHEL 5, и вот мои результаты для отслеживания каталога abc:
Это исключит ошибку каталогов и журналов и всех файлов в каталогах:
Добавление подстановочного знака после исключенного каталога исключит файлы, но сохранит каталоги:
источник
Используйте команду find в сочетании с опцией tar append (-r). Таким образом, вы можете добавлять файлы в существующий tar за один шаг, вместо двухпроходного решения (создать список файлов, создать tar).
источник
Вы также можете использовать один из параметров --exclude-tag в зависимости от ваших потребностей:
Папка с указанным файлом будет исключена.
источник
Прочитав все эти хорошие ответы для разных версий и решив проблему для себя, я думаю, что есть очень мелкие детали, которые очень важны и редки для общего использования GNU / Linux , которые недостаточно подчеркнуты и заслуживают большего, чем комментарии.
Поэтому я не буду пытаться ответить на вопрос для каждого случая, а вместо этого попытаюсь зарегистрироваться, где искать, когда что-то не работает.
ЭТО ОЧЕНЬ ВАЖНО ДЛЯ УВЕДОМЛЕНИЯ:
В моем случае для GNU tar 1.29 на Debian stretch сработала команда
Цитаты не имели значения, они работали с ними или без них.
Надеюсь это кому-нибудь пригодится.
источник
Вы можете использовать cpio (1) для создания файлов tar. cpio принимает файлы для архивации на stdin, поэтому, если вы уже выяснили команду find, которую хотите использовать для выбора файлов архива, направьте ее в cpio для создания файла tar:
источник
gnu tar v 1.26 - --exclude должен следовать за аргументами файла архива и каталога резервных копий, не должен иметь начальных или конечных слешей и не предпочитает кавычки (одинарные или двойные). Таким образом, по отношению к каталогу PARENT для резервного копирования, это:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
источник
tar (GNU tar) 1.28
.-X указывает файл, который содержит список имен файлов, которые должны быть исключены из резервной копии. Для Instance вы можете указать * ~ в этом файле, чтобы не включать имена файлов, оканчивающиеся на ~ в резервной копии.
источник
tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Лучше всего использовать find с tar через xargs (для обработки большого количества аргументов). Например:
источник
find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
xargs
следует использоватьr
опцию tar вместо того,c
потому что, когда наfind
самом деле находит множество результатов, xargs будет разбивать эти результаты (основываясь на ограничении локальных аргументов командной строки) на куски и вызывать tar для каждой части. Это приведет к архиву, содержащему последний возвращенный чанк,xargs
а не все результаты, найденныеfind
командой.Возможно избыточный ответ, но так как я нашел его полезным, вот оно:
В то время как корень FreeBSD (то есть использующий csh) я хотел скопировать всю мою корневую файловую систему в / mnt, но без / usr и (очевидно) / mnt. Вот что сработало (я на /):
Весь мой смысл в том, что было необходимо (поставив ./ ) указать tar, что исключенные каталоги были скопированы как часть большего каталога.
Мои € 0,02
источник
Мне не повезло получить tar, чтобы исключить поддиректорию на 5 гигабайт глубиной в несколько уровней. В конце концов, я просто использовал команду unix Zip. Это работало намного легче для меня.
Так что для этого конкретного примера из исходного поста
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)
Эквивалент будет:
(ПРИМЕЧАНИЕ: вот пост, который я первоначально использовал, который помог мне /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )
источник
zip
не упаковывает пустые каталоги, ноtar
делает!Проверьте это
источник
Я хочу иметь свежую переднюю версию (угловая папка) на localhost. Кроме того, папка git в моем случае огромна, и я хочу ее исключить. Мне нужно скачать его с сервера и распаковать, чтобы запустить приложение.
Сожмите угловую папку из / var / lib / tomcat7 / webapps, переместите ее в папку / tmp с именем angular.23.12.19.tar.gz
Команда:
источник
Успешный пример: 1) если указать полный путь для резервного копирования, в исключении также следует использовать полный путь.
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC
2) при указании текущего пути для резервного копирования в исключении также должен использоваться только текущий путь.
tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC
Случай отказа:
если дать каталогу currentpath для резервного копирования и игнорировать полный путь, то работать не будет
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC
Примечание: упоминание exclude до / после резервного копирования вполне подойдет.
источник
Если вы пытаетесь исключить файлы системы контроля версий (VCS), tar уже поддерживает два интересных варианта! :)
Эта опция не включает файлы и каталоги , используемые следующими системами контроля версий:
CVS
,RCS
,SCCS
,SVN
,Arch
,Bazaar
,Mercurial
, иDarcs
.Начиная с версии 1.32 исключены следующие файлы:
CVS/
и все под нимRCS/
и все под нимSCCS/
и все под ним.git/
и все под ним.gitignore
.gitmodules
.gitattributes
.cvsignore
.svn/
и все под ним.arch-ids/
и все под ним{arch}/
и все под ним=RELEASE-ID
=meta-update
=update
.bzr
.bzrignore
.bzrtags
.hg
.hgignore
.hgrags
_darcs
При архивировании каталогов, которые находятся в какой-либо системе контроля версий (VCS), часто удобно читать шаблоны исключений из файлов игнорирования этой VCS (например
.cvsignore
,.gitignore
и т. Д.). Эта опция предоставляет такую возможность.Перед архивацией каталога, содержит ли он какой - либо из следующих файлов:
cvsignore
,.gitignore
,.bzrignore
, или.hgignore
. Если это так, прочитайте игнорировать шаблоны из этих файлов.Шаблоны обрабатываются так же, как соответствующие VCS, то есть:
.cvsignore
Содержит шаблоны глобализации в стиле оболочки, которые применяются только к каталогу, в котором находится этот файл. Нет комментариев в файле. Пустые строки игнорируются.
.gitignore
Содержит ракушечные узоры. Применяется к каталогу, в котором
.gitfile
находится, и всем его подкаталогам.Любая строка, начинающаяся с a,
#
является комментарием. Обратная косая черта экранирует символ комментария..bzrignore
Содержит шаблоны оболочки и регулярные выражения (если префикс
RE:
(16). Шаблоны влияют на каталог и все его подкаталоги.Любая строка, начинающаяся с a,
#
является комментарием..hgignore
Содержит регулярные выражения posix (17). Линия
syntax: glob
переключается на шаблоны оболочки. Линияsyntax: regexp
переключается обратно. Комментарии начинаются с#
. Шаблоны влияют на каталог и все его подкаталоги.tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/
источник
Следующий скрипт bash должен сделать свое дело. Он использует ответ, данный здесь Маркусом Сундманом.
Это распечатает нужную вам команду, и вы можете просто скопировать и вставить ее обратно. Вероятно, есть более элегантный способ предоставить ее непосредственно в командной строке.
Просто измените * .CC на любое другое распространенное расширение, имя файла или регулярное выражение, которое вы хотите исключить, и это все равно должно работать.
РЕДАКТИРОВАТЬ
Просто чтобы добавить небольшое объяснение; find генерирует список файлов, соответствующих выбранному регулярному выражению (в данном случае * .CC). Этот список передается через xargs команде echo. Это печатает - исключить «одну запись из списка». Косая черта () - это экранирующие символы для меток.
источник