Команда оболочки для каталога 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 .
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.txtmyInputFile.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 --versiontar (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