Команда оболочки в каталог 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-символами для меток.