在tar发生之前重命名目录名称

moe*_*oey 37 bash shell command-line tar

我有一个目录,例如/var/tmp/my-dir/我经常用以下命令压缩:

$ cd /var/tmp/
$ tar -zcf my-dir.tar.gz my-dir/*
Run Code Online (Sandbox Code Playgroud)

后来,当我解开my-dir.tar.gz时,它将my-dir/在当前目录中创建.听起来这个my-dir目录被"包裹"在tarball中.是否有tar选项重命名my-dir为例如your-dir 实际tarring发生之前.以便 ...

$ tar -zxf my-dir.tar.gz
# So that ... this creates your-dir/, instead of my-dir/
Run Code Online (Sandbox Code Playgroud)

谢谢.

eph*_*ent 61

哪个tar

GNU Tar接受一个--transform参数,您可以使用该sed表达式来操作文件名.

例如,要在解包期间重命名:

tar -zxf my-dir.tar.gz --transform s/my-dir/your-dir/
Run Code Online (Sandbox Code Playgroud)

BSD tar和S tar同样有一个-s参数,采用简单/old/new/(不是一般sed表达式).


小智 7

对于mac作品-s标志.

压缩时重命名:

tar -zcf my-dir.tar.gz -s /^my-dir/your-dir/ my-dir/*

重命名提取:

tar -zxf my-dir.tar.gz -s /^my-dir/your-dir/


Dr.*_* II 5

迟到了,但这是我经过时间验证的方法。当我有一个 tar 文件提取到我不喜欢的顶级目录名称时,我通过创建我喜欢的目录名称然后将 tar 与-C--strip-component选项一起使用来解决它。

mkdir your-dir && tar -zxvf my-dir.tar.gz -C your-dir --strip-components=1
Run Code Online (Sandbox Code Playgroud)

-C仿佛在指定目录而提取--strip-component说忽略存储在tar文件的内容,第一个层次。

乍一看,这种方法可能不如其他人给出的 sed 风格的解决方案优雅,但我认为这种方法确实有一些优点。