如何通过 mv 管道传输 tar 的输出?

如何通过 mv 管道传输 tar 的输出?

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目标目录(如迪伊夫的回答)或事后重命名(如通配符的答案)。

我更喜欢前者,但使用-Cand--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。在这种情况下,您会得到更好的服务提取然后根据需要重命名

相关内容