正如标题所说,我可以相对于文件当前位置移动它吗?
假设我在根目录中,具有以下文件结构:
...
├──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/)
笔记:
- 由于某种原因(例如路径中的拼写错误)
&&
如果失败则不会运行。cd
mv
- 再次,如果
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