如何在不复制的情况下更深地移动文件内容

如何在不复制的情况下更深地移动文件内容

我有文件在/home/jjblack/foo/.我想将该目录的所有内容移至/home/jjblack/foo/bar/.

由于磁盘空间不足,我无法将内容复制到其他地方。我能够

mv /home/jjblack/foo /home/jjblack/xyz
mkdir /home/jjblack/foo
mv /home/jjblack/xyz /home/jjjblack/foo/bar

但是有没有更优雅的单行解决方案呢?

答案1

您显示的命令序列,此处带有缩短的路径名,假设jjblack是当前用户(使用其他方式~jjblack代替~):

mv ~/foo ~/xyz
mkdir ~/foo
mv ~/xyz ~/foo/bar

我认为这相当优雅,唯一缺少的是一些安全检查,以确保如果前面的命令失败,后面的命令不会被执行:

[ ! -e ~/xyz ] &&
mv ~/foo ~/xyz &&
mkdir ~/foo &&
mv ~/xyz ~/foo/bar

或者,如果您需要将其放在一行中:

[ ! -e ~/xyz ] && mv ~/foo ~/xyz && mkdir ~/foo && mv ~/xyz ~/foo/bar

现在,这是一个由“简单命令”的“AND 列表”组成的单个“完整命令”(在 shell 语法意义上)。

这避免了隐藏名称的任何问题,它不会扩展通配模式,从而导致可能有数百万个名称的列表,它不会尝试移动单个文件(比移动单个目录慢),并且不会使用任何大量文件额外的存储空间。它还成功地将原始目录的元数据(所有权和权限等)移动foo到新名称bar

执行相同操作的另一种方法是首先创建新的父目录,最后重命名它。这使我们能够摆脱-e测试,因为如果名称已经存在,测试mkdir就会失败。~/xyz

mkdir ~/xyz &&
mv ~/foo ~/xyz/bar &&
mv ~/xyz ~/foo

答案2

cd /home/jjblack/foo
mkdir bar && mv * bar/

相关内容