在文件上运行命令时,有没有办法在不输入完整名称的情况下引用该文件?

在文件上运行命令时,有没有办法在不输入完整名称的情况下引用该文件?

例如:

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 循环是您可能已经在使用的常见模式,但没有想过应用于这个问题。当我最初想到的时候,我也没有想到这一点。

相关内容