在 bash 中,如何重命名文件而不重复路径?

Nat*_*ong 41 bash rename mv

可能的重复:
在 bash 命令上重用文本

如果我想将一个文件重命名到几个目录深处,如何避免重复路径?

例如:

mv path/to/old_filename.txt path/to/new_filename.txt
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法做到这一点:

mv path/to/old_filename.txt (?)new_filename.txt
Run Code Online (Sandbox Code Playgroud)

哪里(?)可以说“在同一目录中”。

Dar*_*oid 63

您可以使用大括号扩展: mv path/to/{old_filename.txt,new_filename.txt}

是 bash shell 中大括号扩展的 GNU 指南的链接,它定义了一个替换列表,并告诉 bash 在每次重复时使用不同的替换来重复参数。

例如,

a{b,c,dd,e}
Run Code Online (Sandbox Code Playgroud)

将扩展到

ab ac add ae
Run Code Online (Sandbox Code Playgroud)

唯一的警告是扩展的重复必须能够作为目标程序的参数相互跟随。

  • 或者保持最小:`mv path/to/{old,new}_filename.txt`。这也有助于命令的反转或其他类型的接近重复。我已经做了很多次,例如`mv /etc/X11/xorg.conf{,.backup}`,能够通过简单的更改`mv /etc/X11/xorg.conf{.backup,}` 来逆转这个过程。 (5认同)

小智 27

Darth上面的回答很聪明,但是如果您想使用 with 的方法cd,您也可以考虑使用子shell:

(cd path/to && mv old_filename.txt new_filename.txt)
Run Code Online (Sandbox Code Playgroud)

由于目录更改发生在子 shell 中,因此您实际上不会在交互式 shell 中更改目录。

  • 显着缺点:您不能对“old_filename.txt”使用制表符补全。 (2认同)

gle*_*man 27

使用 bash历史扩展

mv path/to/oldfile !#:1:h/newfile
Run Code Online (Sandbox Code Playgroud)

其中的!#:1:h意思是:从您当前键入的行 ("!#") 中,取出第一个单词 (":1"),然后仅取出路径组件 (":h" -- 头部)。

  • 凉爽的!我认为 Darth 的大括号扩展方法更容易,但这正是我所要求的。 (2认同)

Kei*_*thB 10

如果您要在目录中执行多个命令,另一种有用的替代方法是:

pushd /path/to
mv oldfile newfile
...
popd
Run Code Online (Sandbox Code Playgroud)