我有一个像myArchive123.tar.gz
. 它里面包含一个文件夹,如helloWorld
如果我提取它:tar -xf myArchive123.tar.gz
我得到helloWorld
文件夹:
ls
myArchive123.tar.gz
helloWorld
Run Code Online (Sandbox Code Playgroud)
我希望输出的名称与文件名减去 .tar.gz 扩展名相同。IE:
tar <magic paramaters> myArchive123.tar.gz
ls
myArchive123.tar.gz
myArchive123
cd myArchive123
ls
helloWorld
Run Code Online (Sandbox Code Playgroud)
这能做到吗?
编辑
同时,我自己编写了一个似乎可以完成工作的脚本。(请参阅下面我发布的答案)。如果可以改进,请随时发表评论/其他答案。最重要的是它应该可以打包成一个单线,如:
extract <file>
Run Code Online (Sandbox Code Playgroud)
Hri*_*dam 16
$ tar -xf myArchive123.tar.gz --one-top-level
Run Code Online (Sandbox Code Playgroud)
--one-top-level [=DIR]
将所有文件提取到 DIR 中,或者,如果不带参数使用,则提取到由存档的基本名称命名的子目录中(减去 --auto-compress 可识别的标准压缩后缀)。
Eri*_*ouf 11
好吧,您至少可以通过几个步骤来完成。如果你做了
mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>
Run Code Online (Sandbox Code Playgroud)
这将完成任务,尽管可能还有更紧凑的答案。
don*_*sti 11
使用gnu tar
,您可以使用--xform
(或--transform
)/prefix/
在每个文件名前加上:
tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'
Run Code Online (Sandbox Code Playgroud)
注意这里没有领导/
在prefix/
和sed
与表达两端S
排除从文件名转换的符号链接的目标。
要对其进行测试(试运行):
tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names
Run Code Online (Sandbox Code Playgroud)
为了让您开始,这里有一个非常简单的脚本,您可以将其调用为extract <file>
:
STRIP=${1%.*} #strip 最后一个后缀 NAME=${STRIP%.tar} #strip .tar后缀,如果存在 tar -xf "$1" --xform="s|^|$NAME/|S" #run 命令