我想将一个目录的内容移动到具有相同文件夹的另一个目录中。这里是一个示例:我有./backup,其中有目录basetest。现在我想将这些目录移动到./backupArchives中。

我使用此目录:

mv ./backup/* ./backupArchives


但是出现错误

mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty


我尝试使用--force,但是没有运气。

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

评论

您是只是试图将文件夹的内容合并到目标中,还是要覆盖目标中的内容。 (如果您有整个错误,也可以使用......截断数据,这也很有帮助)

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

@UdK即使这行得通,请注意,这不会合并两个目录的内容。移动目录将替换其目标。看看rsync,它将进行合并。

相关:unix.stackexchange.com/questions/127712/merging-folders-with-mv

#1 楼

尽管其手册页没有对此文档进行说明,但是如果目标目录包含文件,则mv将拒绝将目录重命名为另一个目录。在您的情况下,这是一件好事,因为您原来想将源的内容合并到目标中,而mv不会这样做。

使用rsync -a backup/ backupArchives/代替。在此之后,您可以代替经典的
使用
,而不是使用rm -rf backup/*,从而获得更多的极客积分。

评论


好事情要知道!两者都很好。谢谢!

– UdK
13年3月20日在17:54

极客点是最好的点:D

– MadMike
13-10-11在12:54

应当注意,这要求您具有可用空间中的文件夹大小。如果没有的话,会引起可怕的问题。

– Pogrindis
2014年10月2日在21:07

@Pogrindis请说明将发生什么可怕的问题,以及这些问题与其他任何写入完整磁盘的尝试有何不同?确实,由于这两个操作都使原始目录保持完整,因此,如果操作失败,则只需rm -rf backupArchives而不会造成任何后果,更不用说“可怕”的了。

–zwets
2014年10月5日9:15



感谢您命名经典方法,如果rsync不可用,将非常有帮助!也可以使用sudo sh -c'(cd backup && tar c。)使用sudo。 (cd backupArchives && tar xf-)'

– ArendE
2015年6月23日在23:11



#2 楼

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

cp -r ./backup/* ./backupArchives && rm -R ./backup/*


评论


在我的安全模式下,也很巧妙。

–Banned_User
2014年12月23日在18:08

如果需要保留权限和上次修改时间,请添加--preserve

– slashdottir
20 May 19 '18:16

#3 楼

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

mv /var/www/* /recovery/wwwrecovery/


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

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

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

tar -cvzpf backup.tar.gz /var/www 


然后将其移动到其他文件中。另外,我建议您执行此步骤,因为tar会将其压缩并减小尺寸。

要将文件提取到另一个文件夹,请使用

tar -xvzpf /var/www/


如果您需要复制到您不拥有的位置,请确保在您决定使用的任何选项之后,都在命令前加上sudo

sudo tar -cvzpf backup.tar.gz /var/www/


评论


我正在使用Ubuntu 12.10,并且得到:mv:invalid option-'R'尝试`mv --help'以获取更多信息。确实.tar很不错,但是我需要知道这种情况下如何移动文件。谢谢你的帮助

– UdK
2013年3月19日4:34



我使用12.04台式机和服务器,两者都工作良好。请小心,如果您没有在folfer和-R之间留空格。我也尝试了不带-R的情况下对我的工作方式,不带-R的情况下也要尝试,但请谨慎使用拼写:Linux会影响大小写字母!!!而不是路径不正确地移动或从位置移动。如果您没有该文件夹,则希望将其移动到-C之后,它将创建它。还要先尝试:找到文件夹的-iname名称,然后从根目录运行此命令,以查看它是否在其他地方存在(如果您遗漏了拼写错误)。给我你使用的确切命令

– Dimitris Theodoridis
13年3月19日在4:47



那该怎么办.......将该文件名放在**之间

– Dimitris Theodoridis
13年3月19日在4:54

-R当然不应该在第一个参数之后出现。选项(几乎)始终位于命令参数之前。另外,mv没有-R选项,最后,递归与mv不相关。 @DimitrisTheodoridis请先测试您的答案。

–zwets
13年3月19日在7:34



是的,我的兄弟,您说的对,我的拼写总是有问题,总之我找不到终端或命令的问题,或者创建了我不知道的新文件和目录,只是用于bas拼写...使用cp命令,而不是在这里为那个兄弟写了mv sory:D

– Dimitris Theodoridis
13年3月19日在17:23

#4 楼

当然,rsync确实可以正常工作,但是对于不支持rsync的机器(例如,在cpanel中,默认情况下未安装rsync的机器)也可以正常工作。 />
cd /path/to/backup/ && cp -R --parents ./* ../backupArchives


然后如有必要,请删除backup目录

注1:在执行cd

注2之前,需要先将backup移至cp -R --parents ...目录。如果您从备份中获取了新文件,请仔细检查backupArchives目录。

#5 楼

在提出问题之前,让我们考虑一个简化的案例。

假设在/ home / admin中,我们有两个文件夹foobar,它们具有相同的子目录结构,但是每个文件夹中包含不同的文件。现在我们想将它们合并为一个。当我们执行mv foo/* bar之类的操作时,会出现错误mv: directory not empty

我的解决方案是放弃命令行工具,而切换到GUI文件管理器,例如dolphin。在海豚中将foo重命名为bar时,它使您可以选择写入目标文件夹,并询问是否以交互方式覆盖现有文件。这样避免了复制和删除,实际上无需一行代码即可节省您的时间。

PS:我并没有测试每个文件管理器。但是其中大多数应该具有此功能。

#6 楼

在脚本执行过程中移动目录时,您需要考虑不存在的目录或空目录,并在没有确认的情况下强制覆盖和删除:

# If old directory exists, and isn't empty
if [[ -d old_dir ]] && [[ -n `ls -A old_dir` ]] ; then

  # Make a new directory (skip if already exists)
  mkdir -p new_dir

  # Copy all files to the new directory (-afr : Keep attributes, Force overwrite, Recursive copy)
  cp -afr old_dir/* new_dir/

  # Remove old directory
  rm -rf old_dir
fi