mv:目录不为空

UdK*_*UdK 224 directory mv

我想将目录的内容移动到具有相同文件夹的另一个目录中。

下面是一个例子:

我有./backup目录basetest. 现在我想将这些目录移动到./backupArchives.

我用这个:

mv ./backup/* ./backupArchives
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty
Run Code Online (Sandbox Code Playgroud)

我尝试使用--force,但没有运气。当文件夹已经存在时,有没有办法移动它?

注意:我只想合并内容,没有覆盖。

zwe*_*ets 268

虽然它的手册页没有记录它,但mv如果目标目录包含文件,它将拒绝将目录重命名为另一个目录。这在您的情况下是一件好事,因为您最终想要源的内容合并到目标中,但这是mv行不通的。

使用rsync -a backup/ backupArchives/来代替。在那之后rm -rf backup/*

除了使用rsync,您还可以执行经典的

(cd backup && tar c .) | (cd backupArchives && tar xf -)
Run Code Online (Sandbox Code Playgroud)

这将为您赢得更多极客积分。

  • 极客点是最好的点:D (9认同)
  • 好东西要知道!两者都工作得很好。谢谢! (5认同)
  • 感谢您命名经典方法,如果 rsync 不可用,则非常有帮助!也可以使用 `sudo sh -c '(cd backup && tar c .) | (cd backupArchives && tar xf -)'` (5认同)
  • @Pogrindis 请解释会发生什么_可怕的_问题,以及它们与任何其他写入完整磁盘的尝试有何不同?事实上,由于这两个操作都保持原始目录完好无损,如果操作失败,您只需`rm -rf backupArchives` 没有任何后果,更不用说“可怕”的后果了。 (4认同)
  • 应该注意,这要求您在可用空间中有文件夹的大小。否则会导致可怕的问题。 (2认同)
  • 您可以使用 rsync 的 --remove-source-files 选项,而不是使用“rm -rf backup/*”命令删除文件夹。 (2认同)
  • @eaykin 选项`--remove-source-files` 只从源目录中删除文件,而不是目录。 (2认同)

pat*_*cek 63

快速而肮脏,如果您知道自己在做什么:

cp -r ./backup/* ./backupArchives && rm -R ./backup/*
Run Code Online (Sandbox Code Playgroud)

  • 也适用于我的安全模式,天才。 (3认同)
  • 如果需要保留权限和上次修改时间,请添加 --preserve (2认同)

Dim*_*dis 8

在您移动您需要的目录之后*(代表任何文本或数字)。例如:

mv /var/www/* /recovery/wwwrecovery/
Run Code Online (Sandbox Code Playgroud)

就是这样,如果您移动文件,则移动为:

mv /var/www/index.php /recovery/index.php

另一种方法是使用 tar 打包该文件夹内容:

tar -cvzpf backup.tar.gz /var/www 
Run Code Online (Sandbox Code Playgroud)

然后移动它位于任何其他文件。我也推荐这一步,因为 tar 压缩它并使它的尺寸更小。

要将文件解压缩到另一个文件夹,请使用

tar -xvzpf /var/www/
Run Code Online (Sandbox Code Playgroud)

如果您需要复制到不属于您的位置,请确保sudo在您决定使用的任何选项之后添加命令。

sudo tar -cvzpf backup.tar.gz /var/www/
Run Code Online (Sandbox Code Playgroud)

  • `-R` 肯定不应该出现在第一个参数之后。选项(几乎)总是在命令参数之前。此外,`mv` 没有 `-R` 选项,最后,递归与 `mv` 无关。@DimitrisTheodoridis 请先测试您的答案。 (2认同)

小智 5

我必须复制一个包含大量大文件的非常大的目录,因此我在目标目录中创建了指向原始文件的硬链接,如下所示:

cp -al ./backup/* ./backupArchives
Run Code Online (Sandbox Code Playgroud)

然后我删除了原始文件,只留下每个文件的一个硬链接。

由于硬链接非常节省空间,您甚至可以使用硬链接将backupArchivesbackup目录复制到新的试用位置,并检查文件计数是否符合您的预期(作为虚拟运行)。这假设您的文件系统支持硬链接 - ext4 支持。