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



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



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



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



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



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



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



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



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



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

23 ответов:

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

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

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

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

Я испытал это, по крайней мере, с программа версия 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/backup / filename.тгз . )

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

zip-r / backup / filename.застежка-молния. -папку 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 для любого другого общего расширения, имени файла или регулярного выражения, которое вы хотите исключить, и это все равно должно работать.

EDIT

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

Comments

    Ничего не найдено.