如何tar不同目录中的节点模块?

时间:2016-07-14 13:50:17

标签: unix tar

我想为每个子模块缓存节点模块。我怎么能这样做?例如,我有以下目录结构:

/test1/node_modules
/test2/node_modules 

如何tar主目录下的每个节点模块目录,以便我可以拥有一个具有以下结构的zip文件

/test1/node_modules
/test2/node_modules

修改

我的意思是我想获取主目录下的所有node_modules目录。 node_modules目录可以在目录test1或test2或test3下。我希望得到所有这些并压缩它们,维护目录结构。因此,在zip文件中,它们将是test1/node_modulestest2/node_modules

...但我也想要一个“全能”解决方案......每个node_modules目录应该在我的焦油中。

2 个答案:

答案 0 :(得分:0)

目前还不清楚你被封锁的地方。我将如何做到这一点:

使用2个不同的命令,一个用于创建,一个用于添加:

# create my.tar
tar cf my.tar /test1/node_modules/*

# add second directory with tar uf
tar uf my.tar /test2/node_modules/*

如果您有超过test1& test2,但希望拥有所有test dirs:

tar cf my.tar /test*/node_modules/

如果你想要每个node_modules,那么使用一个find命令,用你的tar命令管道

find / -type d -name node_modules | xargs tar cf my.tar

答案 1 :(得分:0)

假设您有这些node_modules

➦  tree ./
./
├── pack.js
├── test1
│   └── node_modules
│       └── a
└── test2
    └── node_modules
        └── b

4 directories, 3 files

您可以使用节点脚本打包文件。 /^test\d+/表示test1 test2 test3等。

'use strict';

const fstream = require('fstream');
const zlib = require('zlib');
const tar = require('tar');
const path = require('path');

const dist = path.join(__dirname, 'all.tgz');

fstream.Reader({
  path: __dirname,
  filter() {
    return this.path === __dirname ||
      path.relative(__dirname, this.path).match(/^test\d+/);
  },
})
.pipe(tar.Pack({ fromBase: true }))
.pipe(zlib.createGzip())
.pipe(fstream.Writer(dist));

运行node pack.js,所有node_modules目录将在一个文件all.tgz中。

vim all.tgz

" tar.vim version v29
" Browsing tarfile
" Select a file with cursor and press ENTER

/
test1/
test1/node_modules/
test1/node_modules/a
test2/
test2/node_modules/
test2/node_modules/b