Команда оболочки для доступа к каталогу tar, исключая определенные файлы/папки
Вопрос
Существует ли простая команда/скрипт оболочки, которая поддерживает исключение определенных файлов/папок из архивирования?
У меня есть каталог, который необходимо заархивировать, с подкаталогом, содержащим несколько очень больших файлов, резервное копирование которых мне не нужно.
Не совсем решения:
А 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., это недостаточно подчеркнуто и заслуживает большего, чем просто комментариев.
Поэтому я не буду пытаться ответить на вопрос по каждому случаю, а вместо этого попробую зарегистрироваться где искать когда что-то не работает.
ОЧЕНЬ ВАЖНО ЗАМЕТИТЬ:
- ПОРЯДОК ВАРИАНТОВ: это не то же самое, что поставить --exclude до, чем после опции файла и каталогов для резервного копирования.Это неожиданно, по крайней мере для меня, потому что, по моему опыту, в командах GNU/Linux обычно порядок опций не имеет значения.
- В разных версиях tar эти параметры будут располагаться в разном порядке: например, @ Ответ Эндрю указывает, что в GNU tar v 1.26 и 1.28 исключение идет последним, тогда как в моем случае с GNU tar 1.29 все наоборот.
- КОНЕЧНЫЕ косые черты имеют значение:по крайней мере, в 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-символом для знаков '.