mv
这样做吗?它(mv * ..
)抱怨mv: cannot move `xyz' to `../xyz': Directory not empty
我缺少什么?
#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 楼
您可以使用cp
和rm
进行此操作,但无需复制大量数据(大概)是在尝试避免传输数据。 @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
而不是默认值。
评论
您是否尝试过mv -f?我不知道为什么mv -f不是正确的答案。
@PedroLobito:因为它不起作用? -f仅覆盖文件,但如果移动目标中存在且不为空的子目录,则该文件将不起作用。