it-swarm.com.ru

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

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

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

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

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

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

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

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

Правка: CMA решение работает хорошо. Главное, что --exclude='./folder'ДОЛЖЕН находиться в начале команды tar. Полная команда (сначала cd, поэтому резервное копирование относится к этому каталогу):

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

Вы можете иметь несколько опций исключения для tar, так

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

и т. д. будет работать. Сделайте обязательно чтобы поставить --excludeдо исходный и целевой элементы.

897
Charles Ma

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

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

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

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

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

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

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

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

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

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

41
Sverre

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

17
Eric Manley

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

Итак, вторая команда также должна работать, но, похоже, это не так ...

Лучшие ргдс,

16
GeertVc

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

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

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

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

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

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 *
9
J. Lawson

Для Mac OSX мне пришлось сделать

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

Обратите внимание на -f после --exclude=

7
Jerinaw

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

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

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

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

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

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

6
Aaron Votre

Чтобы избежать возможных ошибок '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 -
5
carlo

Прочитав эту ветку, я провел небольшое тестирование на 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/*'
5
Mike

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

find /dir/dir -Prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
4
Alex B

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

  • --exclude-тег = FILE
  • --exclude-теги все = FILE
  • --exclude-метка-под = ФАЙЛ

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

3
frommelmak

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

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

2
Andrew

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

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
2
camh
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

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

1
Ashwini Gupta

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

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

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

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

ЭТО IS ОЧЕНЬ ВАЖНО УВЕДОМЛЕНИЕ:

  1. ПОРЯДОК ВАРИАНТОВ ОПЦИЙ: это не то же самое, поместите --exclude до, чем после опции файла и каталогов для резервного копирования. По крайней мере, для меня это неожиданно, потому что, по моему опыту, в командах GNU/Linux порядок опций не имеет значения.
  2. В разных версиях tar эти параметры ожидаются в другом порядке: , например, ответ Эндрю указывает, что в GNU tar v 1.26 и 1.28 исключение идет последним, тогда как в моем случае с GNU tar 1.29 это другой путь.
  3. ВОПРОС РЕЗУЛЬТАТОВ СЛЕЗОВ : по крайней мере в GNU tar 1.29, не должно быть любой .

В моем случае для GNU tar 1.29 на Debian stretch сработала команда

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

Цитаты не имели значения, они работали с ними или без них.

Надеюсь это кому-нибудь пригодится.

1
user2553863

Проверьте это

tar cvpzf Zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
0
RohitPorwal

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

Так что для этого конкретного примера из исходного поста
(tar --exclude = './folder' --exclude = './upload/folder2' -zcvf /backup/filename.tgz.)

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

Zip -r /backup/filename.Zip. -x загрузка/папка/**\* загрузка/папка2/**\*

(ПРИМЕЧАНИЕ: вот пост, который я первоначально использовал, который помог мне https://superuser.com/questions/312301/unix-Zip-directory-but-excluded-specific-subdirectories-and- все-в-т )

0
user2792605

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

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

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

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

Мой € 0,02

0
George