我的目录结构如下:
/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 -
tar
pax
tar
某些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
没有--include
by 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