bash 相对于文件的位置移动文件

bash 相对于文件的位置移动文件

正如标题所说,我可以相对于文件当前位置移动它吗?

假设我在根目录中,具有以下文件结构:

...
├──home
   └──user
      ├──Documents
      └──Downloads
         └──foo.bar
...

我想foo.bar从下载移至文档。您可以这样做mv /home/user/Downloads/foo.bar /home/user/Documents/,但是当目录结构更深时,必须再次写入几乎相同的路径会很烦人。

有没有办法表达出来,例如:

mv /home/user/Downloads/foo.bar (whatever operator)/../Documents/

这样文件就会相对于其位置向上移动一个目录并进入文档?

答案1

括号扩展

echo mv /home/user/Downloads/{foo.bar,../Documents/}

echo(如果结果看起来不错则删除)。

请注意,这会生成/home/user/Downloads/../Documents/目标路径。我故意使用了您在引入“任意运算符”时选择的字符串:../Documents/。但如果Downloads是符号链接,则/home/user/Downloads/../可能会解析为除 之外的其他内容/home/user/;在这种情况下/home/user/Downloads/../Documents/,不会等同于/home/user/Documents/

(琐事:cd /home/user/Downloads/../Documents/可能等同于cd /home/user/Documents/。这并不意味着mv会将路径视为等价的。比较这个答案

通常(或者如果符号链接可能干扰)您只会将其用作/home/user/Documents/目标(事实上您确实这样做了)。此路径不依赖于Downloads是否是符号链接。因此,您可能更喜欢以下括号扩展:

echo mv /home/user/{Downloads/foo.bar,Documents/}

它的形式并不强调“相对”方面(而../我猜我们的第一个命令确实强调了这一点),但它仍然可以节省您/home/user/再次输入的时间。

POSIX 未指定括号扩展。它在 Bash 和少数其他 shell 中有效,但在纯 shell 中无效sh


cd

你可以简单地mv foo.bar ../Documents/cd /home/user/Downloads/在子 shell 中执行此操作,主 shell 的当前工作目录不会受到影响:

(cd /home/user/Downloads/ && mv foo.bar ../Documents/)

笔记:

  • 由于某种原因(例如路径中的拼写错误)&&如果失败则不会运行。cdmv
  • 再次,如果Downloads是符号链接,那么../Documents/可能与不同/home/user/Documents/

答案2

$HOME您可以使用或 来引用您的主目录~

例子:

~/Downloads是相同的/home/user/Downloads

您还可以使用.来引用当前工作目录并..引用父目录。

例子:

$ pwd     
/home/mashuptwice/test
$ cd ..        
$ pwd
/home/mashuptwice

如果您需要在 shell 会话中更频繁地引用目录,您也可以将其保存到变量中。

例子:

$ dl="$HOME/Downloads"                                                                                                                                                                                     
$ echo "$dl"
/home/mashuptwice/Downloads
$ cd "$dl"
$ pwd
/home/mashuptwice/Downloads

答案3

另一种方法是使用dirname获取路径的目录部分

file=/here/is/a/file
echo mv "$file" "$(dirname "$file")/newfile"

结果:

mv /here/is/a/file /here/is/a/newfile

相关内容