例如:
tar xvf test.tar.gz ; rm test.tar.gz
有没有更快的方法在第二次执行时引用文件名?
我在想这样的事情(这是无效的):
tar xvf test.tar.gz ; rm $1
有什么可能吗?
我完全了解通配符。
答案1
您可以首先将文件名分配给变量:
f=test.tar.gz; tar xvf "$f"; rm "$f"
或者使用$_
特殊参数,它包含上一个命令的最后一个单词,这通常是(但当然并不总是)您一直在使用的文件名:
tar xvf test.tar.gz; rm "$_"
这也适用于多个命令,只要文件名始终是命令的最后一个参数(例如echo foo; echo $_; echo $_
打印三次foo
。)
顺便说一句,您可能需要考虑使用tar ... && rm ...
, 即&&
与运算符一起代替分号。这样,rm
如果第一个命令失败,则不会运行。
答案2
!$
如果将第二个命令移至新行,则可以使用。
tar xvf test.tar.gz
rm !$
答案3
在bash
4以上的版本中,可以使用历史扩展来引用当前命令的第n个位置参数。例如,tar xvf test.tar.gz
这是命令的第二个位置参数,因此命令可以简化为
tar xvf test.tar.gz && rm !#:2
另一种更便携的方法(用 测试过/bin/dash
)是使用$_
变量来引用最后的位置参数:
tar xvf test.tar.gz && rm "$_"
也可以看看 如何使用同一参数执行多个命令?
答案4
如果您曾经使用循环来处理多个文件,那么您已经在使用一种也可以仅用于一个文件的方法:
for i in a.tgz b.tgz c.tgz; do tar xvf $i; rm $i; done
对于一个文件:
for i in a.tgz; do tar xvf $i; rm $i; done
我发现这个解决方案值得注意,因为这个 for 循环是您可能已经在使用的常见模式,但没有想过应用于这个问题。当我最初想到的时候,我也没有想到这一点。