bash 相对于其位置移动文件

T1M*_*T1M 7 linux file-management bash mv

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

\n

假设我位于根目录,文件结构如下:

\n
...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80home\n   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80user\n      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80Documents\n      \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80Downloads\n         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80foo.bar\n...\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

有没有什么说法,例如:

\n

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

\n

以便文件相对于其位置向上移动一个目录并进入文档?

\n

Kam*_*ski 10

支架扩张

echo mv /home/user/Downloads/{foo.bar,../Documents/}
Run Code Online (Sandbox Code Playgroud)

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

请注意,这将生/home/user/Downloads/../Documents/成为目标路径。我特意使用了您在介绍“whatever 运算符”时选择的字符串:../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/}
Run Code Online (Sandbox Code Playgroud)

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

POSIX 未指定大括号扩展。它可以在 Bash 和其他一些 shell 中工作,但不能在纯sh.


cd

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

(cd /home/user/Downloads/ && mv foo.bar ../Documents/)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 感谢&&如果cd由于任何原因失败(例如路径中的拼写错误)则mv不会运行。
  • 同样,如果Downloads是符号链接,则../Documents/可能与 不同/home/user/Documents/