在bash中,如何在不重复路径的情况下重命名文件?[重复]


39

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

如果要重命名几个目录的文件,如何避免重复路径?

例如:

mv path/to/old_filename.txt path/to/new_filename.txt

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

mv path/to/old_filename.txt (?)new_filename.txt

哪里(?)会说的某种方式“在同一目录下。”

Answers:


26

使用bash 历史记录扩展

mv path/to/oldfile !#:1:h/newfile

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


这是最接近原始提问者所假定的解决方案的方法,并且很有用,因此+1。
crazy2be 2011年

2
凉!我认为Darth的大括号扩展方法更容易,但这正是我所要求的。
弥敦道(Nathan Long)

我今天学到了两个很棒的新东西。另外,我将永远认为括号扩展是“ Darth的括号扩展”,因为它听起来很棒。
PILEOfMush 2011年

62

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

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

例如,

a{b,c,dd,e}

将扩展到

ab ac add ae

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


5
或将其最小化:mv path/to/{old,new}_filename.txt。这也有助于命令的反转或其他接近重复的操作。我已经做了很多次,例如mv /etc/X11/xorg.conf{,.backup},能够通过简单的更改来逆转该过程mv /etc/X11/xorg.conf{.backup,}
丹尼尔·安德森

26

达斯(Darth)的答案很聪明,但是如果您想使用的方法cd,还可以考虑使用subshel​​l:

(cd path/to && mv old_filename.txt new_filename.txt)

因为目录更改发生在子外壳程序中,所以您实际上不会在交互式外壳程序中更改目录。


1
重大缺陷:您不能将Tab键使用补全old_filename.txt
bluenote10

9

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

pushd /path/to
mv oldfile newfile
...
popd

5

我喜欢@Darth的答案。这是一个替代方案:cd path/to && mv oldfile newfile && cd -


1
请注意,如果mv失败(例如,没有权限),您将留在path/to目录中。您可以尝试cd path/to && mv oldfile newfile ; cd -确保cd -始终运行,除非cd path/to(没有权限)失败,否则您仍将执行cd -并转到不需要的上一个目录。mlc(+1)子外壳答案更好。我猜cd . && cd path/to && mv oldfile newfile ; cd -会在99.9%的时间内正常工作(cd .只有在您或您当前的dirs权限更改后才会失败;在这种情况下,转到其他目录并没有那么糟糕的结果。)
jimbob博士2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.