A上一个问题我的朋友问如何通过 tar 传输下载的文件,现在我想知道如何通过 mv 传输 tar 的输出。看看我现在有这个命令:
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz
这会创建一个名为 的目录moksha-0.1.0
,但我想知道如何将此输出目录重命名为,也许可以通过此命令末尾的moksha
管道 ( ) 来重命名。|
虽然如果您知道如何在没有管道的情况下执行此操作,但仍然与 wget 和 tar 在同一行代码上,我也很乐意接受它。
需要明确的是,我知道:
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz -C moksha
将创建一个输出目录moksha
,但在此输出目录中会有该moksha-0.1.0
目录,而是我想将此moksha-0.1.0
目录重命名为moksha
,而不是放置moksha-0.1.0
在名为 的新目录中moksha
。
答案1
像这样?
[root@b se]# wget -cqO - https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz --transform=s/moksha-0.1.0/moksha/
[root@b se]# ls
moksha
[root@b se]# ls moksha
ABOUT-NLS config.guess debian Makefile.am
aclocal.m4 config.guess.dh-orig depcomp Makefile.in
AUTHORS config.h.in doc missing
autogen.sh config.rpath enlightenment.pc.in netwm.txt
autom4te.cache config.sub enlightenment.spec.in NEWS
BACKPORTS config.sub.dh-orig INSTALL po
BUGS configure install-sh README
ChangeLog configure.ac intl src
compile COPYING ltmain.sh xdebug.sh
config data m4 x-ui.sh
从tar
手册页:
--变换=表达, --xform=表达 使用 sed 替换表达来转换文件名。
所以sed
这可能是需要的。但如果你有wget
,你可能sed
也有。
答案2
注意:我的回答并不是真的tar
;这是对你问题这一部分的具体回答:
...这会创建一个名为 的目录
moksha-0.1.0
,但我想知道如何将此输出目录重命名为,也许可以通过此命令末尾的moksha
管道 ( ) 来重命名。|
虽然如果您知道如何在没有管道的情况下执行此操作,但仍然与 wget 和 tar 在同一行代码上,我也很乐意接受它。
管道将一个命令的标准输出与下一个命令的标准输入连接起来。它与文件没有太大关系,当然与移动管道中先前命令创建的文件无关。
你想要的是一个列表。
从man bash
:
AND and OR lists are sequences of one of more pipelines separated by
the && and ││ control operators, respectively. AND and OR lists are
executed with left associativity. An AND list has the form
command1 && command2
command2 is executed if, and only if, command1 returns an exit status
of zero.
执行简单的 if-then 检查一个命令或使一个命令以另一个命令的成功为条件的最简单方法是使用&&
.例子:
[ -r somefile ] && cat somefile
# Checks if somefile exists and is readable; cats the file if it is.
sed -f sedscript inputfile > outputfile && mv outputfile inputfile
# One way (not the best) to edit a file in place.
# The point is that the second command only executes if the first command "succeeds" (i.e. returns a zero exit status).
因此,对于您的特定命令,只需执行以下操作:
(The whole command you wrote) && mv moksha-0.1.0 moksha
答案3
你不能管道mv
本身的文件-mv
不从标准输入读取源文件。在这种情况下,最好的选择是更改tar
目标目录(如迪伊夫的回答)或事后重命名(如通配符的答案)。
我更喜欢前者,但使用-C
and--strip-components
代替--transform
:
mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
tar -xzC moksha --strip-components=1
(-C
将要不是,事实上,创建它的参数——至少在我的系统的 BSD 或 GNU 上不是tar
。)
这更具可移植性(BSDtar
没有--transform
),并且不会修改moksha-0.1.0
其他地方包含该字符串的文件名 - 相反,它只会删除正在提取的每个文件的路径的第一个组成部分(例如moksha-0.1.0/ABOUT-NLS
变为ABOUT-NLS
)。由于tar
已更改为新moksha
目录,因此存档中的所有内容都将在那里提取。
您在问题中链接的存档在其根目录中只有一个目录,但重要的是要注意,在存档上使用此技术多种的其根目录中的目录会将这些目录中的所有内容转储到 指定的一个目录中-C
。在这种情况下,您会得到更好的服务提取然后根据需要重命名。