当 tar 命令中使用 -C 选项时,如何使用全局/通配符?

当 tar 命令中使用 -C 选项时,如何使用全局/通配符?

我的目录结构如下:

/home/workspace/build/

/home/workspace/js/jai.1.js
/home/workspace/js/jai.2.js
/home/workspace/js/jai.3.js
/home/workspace/js/jai.4.js

我想要柏油全部js前缀为的文件贾伊/home/workspace/js/目录之间的内容/home/workspace/build/

假设创建的 tar 文件的名称是压缩包

所以 压缩包应包含以下文件

jai.1.js
jai.2.js
jai.3.js
jai.4.js

我想使用tar命令来实现此目的,而不是将文件复制到目标然后将其压缩。

编辑

我想从destination目录中将其压缩,即/home/workspace/build/

答案1

(cd ../js && pax -w jai.*.js) | gzip > bundle.tar.gz

会这样做(如果你有命令,则替换pax -w为)。要点是通过使用子 shell仅更改/的当前目录。tar cf -tarpaxtar

某些tar实现(tar这是一个非常不可移植的命令,这就是 POSIX 引入的原因pax)有一个-C选项,可以更改文件集合的目录,但不更改文件输出的目录。它们通常还支持自行z调用gzip或在内部实现 gzip 压缩的选项。

然而,诸如此类的事情:

tar czf bundle.tar.gz -C ../js jai.*.js

不起作用,因为它jai.*.js是由当前目录未更改的 shell 扩展的。有了zsh,你可以这样做:

tar czf bundle.tar.gz -C ../js ../js/jai.*.js(:t)

修改器在哪里:t获取尾巴glob 生成的文件的(基本名称)。

使用pax,您还可以执行以下操作:

pax -'s|.*/||' -w -- ../js/jai.*.js | gzip > bundle.tar.gz

但请注意,剥离前导路径组件的替换也适用于符号链接的目标(某些tar实现具有类似的选项,您可以在其中指定是否需要翻译这些文件),并且如果这些jail.*.js文件中的任何一个,也会给出不同的结果属于类型目录并包含更多文件。

使用 libarchive bsdtar,您还可以执行以下操作:

bsdtar zcf bundle.tar.gz -C ../js --include=. --include='jai.*.js' .

GNUtar没有--includeby has a --exclude,所以你可以这样做:

tar zcf bundle.tar.gz -C ../js --exclude='*[^s.]' \
                               --exclude='*?.' \
                               --exclude='*[^j]s' \
                               --exclude='*[^.]js' .

(虽然这些会添加一个条目.

star

star czf bundle.tar.gz -C ../js 'pat=jai.*.js' .

(但会包括,但不包括目录jai.foo/bar.js中不匹配的文件)jail.*.js

star czf bundle.tar.gz -C ../js 'pat=jai.#[^/].js{%!/*}' .

(其中#<expr>is like<expr>*在 ERE 中,并且{%!/*}like (/.*)?(%什么都不是,!是 OR)) 执行与 相同的操作(cd ../js && tar czf - jai.*.js) > bundle.tar.gz。它还会爬行整个目录结构,仅选择顶层的文件。

对于较新的版本,您还可以使用-find.因此,对于我们的等效项(cd ...),它不会爬入不必要的目录,但仍包含目录中的所有文件jai.*.js

star czf bundle.tar.gz C=../js  -find . \
  \( \( -name '*.js' -o -path '*/*' -o -name . \) -o ! -prune \) ! -name .

尽管更有可能,您实际上想要:

star czf bundle.tar.gz C=../js \
  -find . -maxdepth 1 -name 'jai.*.js' -type f

那只是存档jai.*.js 常规的文件,并且仅在顶层,zsh您也可以这样做:

(cd ../js && pax -w -- jai.*.js(.)) | gzip > bundle.tar.gz

(.)成为一个全局限定符限制于常规的文件)。

答案2

这里不需要正则表达式。您可以像这样使用普通的 shell 星号:

tar cvzf /home/workspace/build/bundle.tar.gz /home/workspace/js/jai.*.js

如果您不想保留目录结构,那么最简单的方法是cd /home/workspace/js/然后tar cvzf /home/workspace/build/bundle.tar.gz jai.*.js

相关内容