Архивировать несколько каталогов в отдельные файлы ZIP, исключая некоторые каталоги [duplicate]

Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.

Вот пример того же:

var async = require("async");

// This wires up result back to the caller
var result = {};
var asyncTasks = [];
asyncTasks.push(function(_callback){
    // some asynchronous operation
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;
            _callback();
        }
    });
});

async.parallel(asyncTasks, function(){
    // result is available after performing asynchronous operation
    console.log(result)
    console.log('Done');
});

Я использую объект result для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.

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

595
задан Rafa 1 June 2015 в 20:49
поделиться

22 ответа

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

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

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

737
ответ дан ericosg 27 August 2018 в 20:00
поделиться

Я согласен, что флаг -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 EITHER. Это может привести к неожиданным результатам при архивировании сторонних библиотек, таких как каталог node_modules.
  • Чтобы избежать этой проблемы, обязательно укажите весь путь, например --exclude='./dirA/data.txt'
4
ответ дан Aaron Votre 27 August 2018 в 20:00
поделиться

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

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
4
ответ дан Alex B 27 August 2018 в 20:00
поделиться

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

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

2
ответ дан Andrew 27 August 2018 в 20:00
поделиться
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

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

1
ответ дан Ashwini Gupta 27 August 2018 в 20:00
поделиться

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

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
2
ответ дан camh 27 August 2018 в 20:00
поделиться

Чтобы избежать возможных ошибок '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 -
4
ответ дан carlo 27 August 2018 в 20:00
поделиться

Следующий скрипт 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. Это печатает --exclude «одна запись из списка». Слэши () являются символами escape для «меток».

0
ответ дан Community 27 August 2018 в 20:00
поделиться

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

11
ответ дан Eric Manley 27 August 2018 в 20:00
поделиться

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

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

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

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

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
116
ответ дан fedorqui 27 August 2018 в 20:00
поделиться

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

  • - exclude-tag = FILE
  • - исключить -tag-all = FILE
  • - exclude-tag-under = FILE

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

2
ответ дан frommelmak 27 August 2018 в 20:00
поделиться

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

, что никто не work:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

Это, в то время как tar --help показывает следующее:

tar [OPTION...] [FILE]

Итак, вторая команда также должна работать, но, судя по всему, она не кажется случай ...

Лучшие rgds,

14
ответ дан GeertVc 27 August 2018 в 20:00
поделиться

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

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

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

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

My € 0.02

0
ответ дан Georgios 27 August 2018 в 20:00
поделиться

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

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

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

4
ответ дан Jerinaw 27 August 2018 в 20:00
поделиться

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

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
1
ответ дан Joe 27 August 2018 в 20:00
поделиться

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

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
10
ответ дан Rob 27 August 2018 в 20:00
поделиться

Проверьте

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
0
ответ дан RohitPorwal 27 August 2018 в 20:00
поделиться

Для тех, у кого есть проблемы с этим, некоторые версии 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 *
2
ответ дан Samuel Liew 27 August 2018 в 20:00
поделиться

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

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
8
ответ дан Scott Stensland 27 August 2018 в 20:00
поделиться

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

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

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

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

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

32
ответ дан Sverre 27 August 2018 в 20:00
поделиться

После прочтения этой темы, я провел небольшое тестирование на RHEL 5, и вот мои результаты для tarring в каталоге abc:

Это исключит ошибки каталогов и журналы и все файлы в каталогах:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

Добавление подстановочного знака после исключенного каталога исключает файлы, но сохраняет каталоги:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
4
ответ дан Undo 27 August 2018 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: