如何压缩tar归档文件中的目录名?

时间:2014-05-06 16:42:09

标签: linux unix tar

假设我有以下目录和文件

inc:
inc/foo.h
inc/bar.h
inc/more.h
src:
src/foo.cc
src/bar.cc
src/more.cc

我希望使用tar生成一个磁带存档,其中包含一些文件(名称中都包含foobar),但好像它们都在一个文件中单个目录。因此,在通过tar -xf archive.tar 解压缩我的档案后,我有

somewhere/foo.h
somewhere/bar.h
somewhere/foo.cc
somewhere/bar.cc

我可以使用tar而不移动/复制文件吗?怎么样?

1 个答案:

答案 0 :(得分:2)

使用GNU tartar --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
$