我想移到父目录的子目录中有大量文件和目录。目标目录中已经有一些文件和目录需要覆盖。仅存在于目标中的文件应保持不变。我可以强迫mv这样做吗?它(mv * ..)抱怨

mv: cannot move `xyz' to `../xyz': Directory not empty


我缺少什么?

评论

您是否尝试过mv -f?

我不知道为什么mv -f不是正确的答案。

@PedroLobito:因为它不起作用? -f仅覆盖文件,但如果移动目标中存在且不为空的子目录,则该文件将不起作用。

#1 楼

您必须使用命令cp -r * ..rm -rf *将它们复制到目标位置,然后删除源。

我认为您不能使用mv“合并”目录。

评论


好吧,那是我不想做的事情,因为这将花费很长时间……无论如何,谢谢。

– EricSchaefer
2011-3-22在17:45

大概mv更快,因为您在同一个文件系统上?如果使用cp -l创建硬链接而不是实际移动文件怎么办?

–mattdm
2011-3-22在20:32

为了保留文件属性(时间戳,权限等),应使用cp -a而不是cp -r。

– dotancohen
2014年2月2日在7:14



对于通过google到达这里的人来说,@ palswim在下面的回答通过创建指向数据的新硬链接,然后删除旧链接来模拟mv的行为。简短答案cp -rl源目标&& rm -r源。

–威廉·埃弗里特(William Everett)
16年5月31日在17:43

#2 楼

rsync可能是一个更好的选择。就像rsync -a subdir/ ./一样简单。

我在filename中的测试树:contents格式:

./file1:root
./file2:root
./dir/file3:dir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir


运行rsync: >
$ rsync -a -v subdir/ ./
sending incremental file list
./
file1
dir/
dir/file3


礼物:

./file1:subdir
./file2:root
./dir/file3:subdir
./dir/file4:dir
./subdir/dir/file3:subdir
./subdir/file1:subdir


然后,为了模拟mv,您可能想要删除源目录:

$ rm -r subdir/


给与:在此答案的顶部附近)具有所需的结果?

评论


rsync副本。这个问题是关于搬家的。

–吉尔斯'所以-不再是邪恶的'
2011-3-22在22:51

@吉尔斯:谢谢。我在末尾添加了rm -r使其与mv基本相同。

– Mikel
2011-3-22在22:53



当源和目标在同一文件系统上时,复制然后删除不等同于mv。 mv是原子的,保留inode编号(因此文件可以保持打开状态),并且无需花费时间和空间即可进行复制。

–吉尔斯'所以-不再是邪恶的'
2011-3-22在23:08

@吉尔斯:我知道,但是目前的主要答案是cp -r; rm -r。我认为从这个意义上讲,rsync也值得一提。

– Mikel
2011-3-22在23:21

这是一个更好的方法,另一种方法是您必须同意在centos 5.9上覆盖每个文件,由于某种原因-f无法解决该问题:/

–约书亚·达尔顿
13年7月27日在6:12

#3 楼

使用参数rsync复制后,--remove-source-files可以删除源。
rsync手册页:
--remove-source-files   sender removes synchronized files (non-dir)


评论


这确实是最好的答案。我不能使用cp -r; rm由于缺乏可用空间。相反,rsync --remove-source-files都将使用的磁盘空间最小化,从而避免了复制完全相同的文件。

–kqw
2014年8月5日在12:10

也许--link-dest到。

–user1133275
20年1月31日,9:47

#4 楼

您可以使用cprm进行此操作,但无需复制大量数据(大概)是在尝试避免传输数据。 @mattdm在其评论中暗示了这一点,而对另一个问题的回答则对各种选项进行了更完整的讨论。

创建文件的硬链接,而不是将其数据复制到新文件。

评论


我知道OP已经完成了提示问题的任务,但是希望这个答案将来可以对任何有此问题的人有所帮助。

–palswim
15年1月31日在7:36

这确实是他们需要的答案。我只是用60GB的成千上万个小型赛勒斯电子邮件文件进行了此操作,而这只花了21秒。

–拉布拉多
2015年5月12日18:37

这也是我采用的路线-我只是将其更改为cp -al源目的地,以保留所有者信息和权限。

–piit79
2015年11月20日,9:32

我认为要执行OP要求的操作,必须添加-f选项,否则如果文件存在,它将不会覆盖。您可以确认还是我做错了什么?

–das Keks
18年1月17日在23:40

@dasKeks:实际上,cp默认情况下会覆盖。 -f选项尝试在尝试重新复制之前删除文件(如rm中一样),这在进程无法打开文件进行写入的情况下会有所帮助,尽管有些人希望看到出现错误。我不知道这对OP是否重要,但是无论如何我都在我的答案中添加了-f标志。

–palswim
18年1月18日,0:53

#5 楼

这是一个脚本,该脚本将文件从/path/to/source/root下移动到/path/to/destination/root下的相应路径。
如果源中存在文件或目录,但目标中不存在,则将其移动。
目标中已经存在的任何文件或目录都将被留下。 (特别是合并的目录留在了源代码中。这不容易修复。)

当心,未经测试的代码。

评论


两个更正:您需要一个\;在find命令第一行的-o之前,您不应该转义!在-如果只是!,而不是\!

– llhuii
2011年4月20日5:30



不起作用-我得到:MV:无法移动“。”到'/ <目标> /./。':设备或资源繁忙。我想将东西从/ a / b移到/ a

– Gerfried
20 Jan 30'21:43



@ Gerfried我只是解决了跳过现有目录的代码中的一个错误。请再试一次。

–吉尔斯'所以-不再是邪恶的'
20年1月31日,9:22

#6 楼

这个线程已经存在多年了,但在Google上仍然排名第一,所以我想添加另一种方法。父目录,然后使用默认的--overwrite行为将其解压缩。这正是您想要的。之后,您可以删除您的子目录。

cd xyz
tar -cvzpf tmp.tar.gz *
mv tmp.tar.gz ../tmp.tar.gz
cd ..
tar -xvzpf tmp.tar.gz
rm -rf xyz
rm -f tmp.tar.gz


评论


仅当您有压缩tar文件的额外空间时,此方法才有效。而且,您真的要在提取后保留临时tar文件吗?

–安东
16年4月13日在9:05

编辑代码以删除tmp文件。如今,在大多数情况下,空间已不是问题。 #TB

–西蒙·克劳斯(Simon Kraus)
16-4-13在9:22



#7 楼

如果您有足够的存储空间,则可以通过以下方式进行操作:

mv -bfv directory_1/* directory_2/ # all duplicate source files/directories 
                                   # will have ~ appended to them
find -name "*~" -delete            # will recursively find and delete all files 
                                   # with ~ on the end


请确保没有任何重要文件,在文件末尾带有〜您可以添加--suffix=whateveryouwant而不是默认值。