使用 mv 时,选择目标时请考虑原始文件的路径/名称

使用 mv 时,选择目标时请考虑原始文件的路径/名称

假设我需要将文件移动/etc/dir1/dir2/dir3/a.out/etc/dir1/dir2/dir3/b.out

两次输入整个路径非常繁琐,而且转到目录可能不太理想。有没有办法在不重新输入目录的情况下完成这样的移动?

关于相关问题(我怀疑有相同的解决方案)。假设我想将文件移动someverybigfilename.pngsomereallybigfilename.png。有没有办法在不重新输入名称的情况下完成此操作?

(我知道我可以使用脚本。但是它mv本身支持这样的东西吗?)

简而言之:如何使用 move 部分更改/仅更改文件名的一部分?如何进行扩展名之类的小更改?

答案1

在第一种情况下,如果您使用bash,则可以使用括号扩展

mv /etc/dir1/dir2/dir3/{a.out,b.out} 

甚至

mv /etc/dir1/dir2/dir3/{a,b}.out

在第二种情况下,你可以再次使用括号扩展:

mv some{very,really}bigfilename.png

或者(虽然这并不能节省太多的输入)你可以使用 Bash历史扩展如下:

$ mv someverybigfilename.png !#$:s/very/really
mv someverybigfilename.png somereallybigfilename.png

答案2

任何一个

cd /etc/dir1/dir2/dir3/
mv a.out b.out

或者

编写如下脚本

#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"

mv $dir_Path\a.out $dir_Path\b.out

exit

并重命名:

#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"
name_part="bigfile.png"
cd $dir_Path
mv some$name_part somereally$name_part

exit

答案3

如果路径相同,我不明白为什么不进入该文件夹。

您可以使用 pushd 保存路径或使用 cd 返回 -

例子:

luca@elite:~$ pushd dir1/dir2/dir3/
~/tmp/dir1/dir2/dir3 ~/tmp
luca@elite:~/dir1/dir2/dir3$ mv a.out b.out
luca@elite:~/dir1/dir2/dir3$ popd
~/tmp
luca@elite:~$ 

或者

luca@elite:~$ cd dir1/dir2/dir3/
luca@elite:~/dir1/dir2/dir3$ mv b.out a.out
luca@elite:~/dir1/dir2/dir3$ cd -
luca@elite:~$ 

关于文件名,我唯一想到的就是将其存储在一个变量中。

答案4

有几种方法可以解决这个问题。一种方法是通过~/.bashrc文件中定义的函数。

pmv(){
    mv "$1"/"$2" "$1"/"$3"
}

然后该pmv函数将接受 3 个参数。目录路径、源文件和目标文件。例如:

$ ls testdir
self_test.sh*  test.wxg
$ pmv ./testdir  test.wxg  test2.wxg                                                                                     
$ ls testdir                                                                                                             
self_test.sh*  test2.wx

请注意,在这个函数中,我们用斜杠连接目录路径和文件路径,因此当目录路径作为命令行参数给出时,末尾不应该有斜杠。但是,我们可以使用 bash 的参数扩展,这样我们就可以使用/path/to/dir/path/to/dir/

pmv(){
    mv "${1%/}"/"$2" "${1%/}"/"$3"
}

关于相关问题(我怀疑有相同的解决方案)。假设我想将文件 someverybigfilename.png 移动到 somereallybigfilename.png。有没有办法在不重新输入名称的情况下完成此操作?

实际上,不,没有办法mv单独做到这一点。即使是steeldriver 和我对问题第一部分的解决方案也利用了bash的功能,而不是mv的功能。更高级的重命名操作(例如,在您的情况下将文本插入文件名)应该prename使用 perl 正则表达式来动态重命名文件。

$ touch someverybigfilename.png

$ prename 's/very/really/' someverybigfilename.png                                                                       

$ ls somereallybigfilename.png                                                                                           
somereallybigfilename.png

相关内容