假设我有以下目录和文件
inc:
inc/foo.h
inc/bar.h
inc/more.h
src:
src/foo.cc
src/bar.cc
src/more.cc
我希望使用tar
生成一个磁带存档,其中包含一些文件(名称中都包含foo
或bar
),但好像它们都在一个文件中单个目录。因此,在通过tar -xf archive.tar
解压缩我的档案后,我有
somewhere/foo.h
somewhere/bar.h
somewhere/foo.cc
somewhere/bar.cc
我可以使用tar而不移动/复制文件吗?怎么样?
答案 0 :(得分:2)
使用GNU tar
和tar --help
:
文件名转换:
--strip-components=NUMBER
从提取时的文件名中删除NUMBER个前导组件
--transform=EXPRESSION
,--xform=EXPRESSION
使用sed替换EXPRESSION来转换文件名
因此,在它的表面上,你在提取时使用它:
tar -xf filename.tar --strip-components=1 -C somewhere
-C somewhere
在提取文件之前将目录更改为somewhere
。
由于您了解--strip-components
选项,但它不符合您的要求,因此下一个选项是--transform
。由于您要删除路径的所有主要组件,因此表达式可以非常简单:
tar -cf filename.tar --transform='s%.*/%%' .
这似乎有效;我用它测试了它:
$ mkdir junk
$ cd junk
$ mkdir inc src
$ for file in inc/foo.h inc/bar.h inc/more.h src/foo.cc src/bar.cc more.cc; do cp ../makefile $file; done
$ tar -cf - --transform='s%.*/%%' . | tar -tvf -
drwxr-x--- jleffler/eng 0 2014-05-06 10:00 ./
-rw-r----- jleffler/eng 1183 2014-05-06 10:00 more.cc
drwxr-x--- jleffler/eng 0 2014-05-06 10:00 inc/
-rw-r----- jleffler/eng 1183 2014-05-06 10:00 more.h
-rw-r----- jleffler/eng 1183 2014-05-06 10:00 bar.h
-rw-r----- jleffler/eng 1183 2014-05-06 10:00 foo.h
drwxr-x--- jleffler/eng 0 2014-05-06 10:00 src/
-rw-r----- jleffler/eng 1183 2014-05-06 10:00 bar.cc
-rw-r----- jleffler/eng 1183 2014-05-06 10:00 foo.cc
$