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

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

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

не совсем решений:

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

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

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

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

EDIT:cmaрешение работает хорошо. Большой gotcha является то, что --exclude='./folder' должны быть в начале команды tar. Полная команда (сначала cd, поэтому резервное копирование относительно этого каталога):

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

23 ответов


Вы можете иметь несколько вариантов исключения для tar so

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

etc будет работать. Make обязательно поставить --exclude до элементы источника и назначения.


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

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

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

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

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir

возможные варианты исключения файлов / каталогов из резервной копии с помощью 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

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

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

/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 (я пробовал полный путь здесь относительно / но я не могу сделать эту работу).

надеюсь, это поможет кому-то (и мне дальше время я google это)


Я испытал это, по крайней мере, с 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]

Итак, вторая команда должна также работа, но, по-видимому, это не так...

лучшие rgds,


вы можете использовать стандартную "нотацию муравья", чтобы исключить относительные каталоги.
Это работает для меня и исключает любые .каталоги 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


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

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>

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

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}

для Mac OSX я должен был сделать

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

Примечание -f после --exclude=


используйте команду find в сочетании с опцией tar append (-r). Таким образом, вы можете добавить файлы в существующий tar за один шаг, вместо двухпроходного решения (создать список файлов, создать tar).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;

чтобы избежать возможных 'xargs: Argument list too long' ошибки из-за использования find ... | xargs ... при обработке десятков тысяч файлов, вы можете перенаправить вывод find на tar используя find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -

после прочтения этой темы я сделал небольшое тестирование на RHEL 5, и вот мои результаты для дегтя каталога abc:

это исключит ошибку каталогов и журналы и все файлы в каталогах:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

добавление подстановочного знака после исключенного каталога исключает файлы, но сохраняет каталоги:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'

Я согласен, что флаг -- exclude является правильным подходом.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

слово предупреждение для побочного эффекта, который я не нашел сразу очевидным: Исключение "fileA" в этом примере будет искать "fileA"рекурсивно!

пример: каталог с одним подкаталогом, содержащий файл с тем же именем (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • при использовании --exclude='data.txt' архив не будет содержать или данные.txt-файл. Это может привести к неожиданным результатам при архивации сторонних библиотек, таких как каталог node_modules.

  • чтобы избежать этой проблемы, обязательно дайте весь путь, например --exclude='./dirA/data.txt'


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

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 *

вы можете использовать cpio(1) для создания файлов tar. cpio берет файлы в архив на stdin, поэтому, если вы уже выяснили команду find, которую хотите использовать для выбора файлов архива, передайте ее в cpio для создания файла tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz

вы также можете использовать один из параметров "-- exclude-tag " в зависимости от ваших потребностей:

  • --exclude-tag=FILE
  • --exclude-tag-all=FILE
  • --exclude-tag-under=FILE

папка с указанным файлом будет исключена.


gnu tar v 1.26 --exclude должен приходить после аргументов архивного файла и резервной копии каталога, не должен иметь ведущих или конечных косых черт и не предпочитает кавычек (одинарных или двойных). Поэтому относительно родительского каталога для резервного копирования это:

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude


лучше всего использовать find с tar, через xargs (для обработки большого количества аргументов). Например:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2

tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

- X указывает файл, содержащий список имен файлов, которые должны быть исключены из резервной копии. Например, вы можете указать *~ в этом файле, чтобы не включать имена файлов, заканчивающиеся на ~ в резервную копию.


возможный избыточный ответ, но так как я нашел его полезным, вот он:

в то время как корень FreeBSD (т. е. используя csh) я хотел скопировать всю мою корневую файловую систему в /mnt, но без /usr и (очевидно) /mnt. Это то, что сработало (я в /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

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

мой €0.02


Мне не удалось получить tar, чтобы исключить подкаталог 5 Gigabyte на несколько уровней глубиной. В конце концов, я просто использовал команду Unix Zip. Для меня это работало намного легче.

Так для этого конкретного примера из исходного поста
(tar --exclude='./ папка ' --exclude='./ upload /folder2' -zcvf/резервное копирование / имя файла.тгз . )

эквивалент будет:

zip-r / резервное копирование / имя файла.застежка-молния. -папку X загрузки//**\* загрузить / folder2/**\*

(Примечание: вот этот пост я первоначально использовал, что помогло мне https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t)


зацените

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName

следующий скрипт bash должен сделать трюк. Он использует данный ответ здесь Маркус Сандман.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

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

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

редактировать

добавить небольшое объяснение; find генерирует список файлов, соответствующих выбранному регулярному выражению (в этом случае *.CC). Этот список передается через xargs команде echo. Эти отпечатки-исключить одну запись из списка. Косые черты () являются escape-символами для меток.