我有一个压缩文件,例如myArchive123.tar.gz
.在里面,它包含一个类似的文件夹helloWorld
如果我使用 提取它tar -xf myArchive123.tar.gz
,我会得到该helloWorld
文件夹:
ls
myArchive123.tar.gz
helloWorld
我希望输出与文件名减去扩展名相同.tar.gz
。 IE:
tar <magic paramaters> myArchive123.tar.gz
ls
myArchive123.tar.gz
myArchive123
cd myArchive123
ls
helloWorld
这可以做到吗?
- 我永远不知道档案里面有什么。它可以是一个文件夹,也可以是许多文件。
- 如果 tar 做不到,我可以使用其他工具。
- 我可以接受可以变成脚本的较长形式
编辑
与此同时,我给自己写了一个脚本,似乎可以完成工作(请参阅下面我发布的答案)。最主要的是它应该可以打包成一个单行代码,例如:
extract <file>
答案1
$ tar -xf myArchive123.tar.gz --one-top-level
--顶层[=DIR]
将所有文件解压到 DIR 中,或者如果不带参数使用,则解压到以存档的基本名称命名的子目录中(减去 --auto-compress 可识别的标准压缩后缀)。
答案2
使用gnu tar
,您可以使用--xform
(或)在每个文件名前面--transform
添加:/prefix/
tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'
请注意,没有前导/
,prefix/
并且表达式以从文件名转换中排除符号链接目标sed
结尾。 测试它(空运行):S
tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names
为了帮助您入门,这里有一个非常简单的脚本,您可以将其调用为extract <file>
:
STRIP=${1%.*} #去掉最后一个后缀 名称=${STRIP%.tar} #strip。柏油后缀(如果存在) tar -xf "$1" --xform="s|^|$NAME/|S" #运行命令
答案3
好吧,您至少可以通过几个步骤来完成。如果你这样做了
mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>
这将完成任务,尽管可能还有更紧凑的答案。
答案4
另一种可能的解决方案是使用--transform
选项:
tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"
与您的文件:
tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"