Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
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
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
У вас может быть несколько вариантов исключения для tar, поэтому
$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
и т. д. будут работать. Обязательно поставьте --exclude
перед исходными и целевыми элементами.
Я согласен, что флаг -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'
Используйте команду find в сочетании с параметром tar append (-r). Таким образом вы можете добавить файлы в существующий tar за один шаг, вместо двухпроходного решения (создать список файлов, создать tar).
find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
gnu tar v 1.26 --exclude должно появиться после архивного файла и аргументов каталога резервного копирования, не должно иметь никаких ведущих или завершающих косых черт и не предпочитает кавычек (одиночный или двойной). Таким образом, для резервной копии каталога PARENT это:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt
-X указывает файл, который содержит список имен файлов, которые должны быть исключены из резервной копии. Для экземпляра вы можете указать * ~ в этом файле, чтобы не включать имена файлов, заканчивающиеся на ~ в резервной копии.
Вы можете использовать cpio (1) для создания файлов tar. cpio берет файлы для архивации на stdin, поэтому, если вы уже определили команду find, которую хотите использовать для выбора файлов в архиве, подключите его к cpio для создания файла tar:
find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
Чтобы избежать возможных ошибок '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 -
Следующий скрипт 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 для «меток».
Вы можете использовать стандартную «аннотацию» для исключения относительных каталогов. Это работает для меня и исключает любые каталоги .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
Вы можете исключить каталоги с --exclude
для tar.
Если вы хотите архивировать все, кроме /usr
, вы можете использовать:
tar -zcvf /all.tgz / --exclude=/usr
В вашем случае возможно что-то как
tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
Вы также можете использовать один из параметров «-exclude-tag» в зависимости от ваших потребностей:
Папка с указанным FILE будет исключена.
Я испытал это, по крайней мере, с 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,
Возможный избыточный ответ, но поскольку я нашел его полезным, вот он:
В то время как root FreeBSD (то есть с использованием csh), я хотел скопировать всю свою корневую файловую систему в / mnt, но без / usr и ( очевидно) / mnt. Это то, что сработало (я нахожусь в /):
tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)
Все мое дело в том, что было необходимо (поставив ./) на указать на tar, чтобы исключить каталоги, в которых копируется большая часть каталога.
My € 0.02
Для Mac OSX мне пришлось делать
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Обратите внимание на -f
после --exclude=
Лучше всего использовать find с tar, через xargs (для обработки большого количества аргументов). Например:
find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
Я нашел это где-то в другом месте, поэтому я не буду брать кредит, но он работал лучше, чем любое из вышеперечисленных решений для моих конкретных проблем (хотя это закрыто):
tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
Проверьте
tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
Для тех, у кого есть проблемы с этим, некоторые версии tar будут работать только без «./» в значении exclude.
Tar --version
tar (GNU tar) 1.27. 1
blockquote>Синтаксис команды, который работает:
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 *
Этот шаблон exclude обрабатывает суффикс имени файла, например png или mp3, а также имена каталогов, такие как .git и node_modules
tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball} ${source_dirname}
Возможные варианты исключения файлов / каталогов из резервной копии с помощью 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 (я пробовал полный путь здесь относительно / но я не могу сделать эту работу).
надеюсь, что это поможет кому-то (и мне в следующий раз я это сделаю)
После прочтения этой темы, я провел небольшое тестирование на 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/*'