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

StackOverflow https://stackoverflow.com/questions/984204

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Чарльз МаРешение работает хорошо.Большая ошибка в том, что --exclude='./folder' ДОЛЖЕН быть в начале команды tar.Полная команда (сначала cd, поэтому резервное копирование выполняется относительно этого каталога):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
Это было полезно?

Решение

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

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

и т. д. будет работать.Делать конечно класть --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 = подробный (вы можете видеть файлы по мере их ввода, что полезно, чтобы убедиться, что ни один из исключенных файлов не добавляется).и f= файл.

Итак, моя команда будет выглядеть так

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

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

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

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

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

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

С наилучшими пожеланиями,

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

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

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

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

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

Tar --version

смола (GNU смола) 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 *

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

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

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

Я согласен, что флаг --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' в архиве не будет ИЛИ файл data.txt.Это может привести к неожиданным результатам при архивировании сторонних библиотек, таких как каталог node_modules.

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

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

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

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

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

  • --exclude-tag=ФАЙЛ
  • --exclude-tag-all=ФАЙЛ
  • --exclude-tag-under=ФАЙЛ

Папка, в которой находится указанный ФАЙЛ, будет исключена.

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

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

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

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

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

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

ОЧЕНЬ ВАЖНО ЗАМЕТИТЬ:

  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/

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

Надеюсь, это будет кому-то полезно.

Лучше всего использовать 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 -)

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

Мои €0,02

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

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

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

zip -r /backup/имя_файла.zip .-x загрузить/папку/**\* загрузить/папку2/**\*

(ПРИМЕЧАНИЕ:Вот пост, который я изначально использовал, который мне помог https://superuser.com/questions/312301/unix-zip-directory-but-excluded-специфические-подкаталоги-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.Это печатает --exclude «одну запись из списка».Косая черта () является escape-символом для знаков '.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top