我有一百万张图像占用了 30GB 的磁盘空间,需要将它们从一个本地目录移动到另一个本地目录。
最有效的方法是什么?使用mv
?使用cp
?使用rsync
?其他方法?
我需要服用这些药物:
/path/to/old-img-dir/*
00000000.jpg
--------.jpg ## nearly 1M of them! ##
ZZZZZZZZ.jpg
并将它们移至此处:
/path/to/new/img/dir/
答案1
rsync
将是一个糟糕的选择,因为它执行了大量的客户端/服务器后台工作,这些工作涉及本地和远程系统。
mv
可能是最佳选择。如果可能,你应该尝试mv directory_old directory_new
而不是mv directory_old/* directory_new/
。这样,你移动的只是一件事,而不是一百万件事情。
答案2
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/
- 这不会溢出参数扩展。
- 如果您愿意,可以指定文件扩展名。(-name ...)
find -print0
withxargs -0
允许您在名称中使用空格。xargs -r
mv
除非有东西需要移动,否则不会运行。(mv
如果没有提供源文件,将会抱怨)。- 该语法
mv -t
允许您首先指定所需的目标文件,然后指定所需的源文件xargs
。 - 移动整个目录当然要快得多,因为无论其中包含的文件数量有多少,它都会在恒定时间内完成,但是:
- 源目录将会消失一小段时间,这可能会给您带来麻烦;
- 如果进程使用当前目录作为输出目录(而不是始终引用非移动位置的完整路径),则必须重新启动它。(就像你对日志轮换)。
顺便说一句,我会问自己是否真的需要一次性移动这么多文件。批处理被高估了。如果我能在文件生成时就处理它们,我会尽量不积累大量的工作。
答案3
如果两个目录位于同一个文件系统,则使用mv
目录而不是目录的内容。
如果它们位于两个不同的文件系统上,请使用 rsync:
rsync -av /source/directory/ /destination
/
注意源上的尾部。这意味着它将复制目录的内容而不是目录本身。如果您/
关闭,它仍将复制文件,但它们将位于名为的目录中/destination/directory
。使用 /,文件将位于/destination
rsync
如果您以 root 身份运行它或文件归您所有,它将保留文件所有权。它还将保留mtime
每个单独文件的所有权。
答案4
由于 directory_old 和 directory_new 都位于同一个文件系统上,因此您可以使用cp -l
而不是mv
作为选项。cp -l
将创建指向原始文件的硬链接。当您完成“移动”并对结果感到满意时,您可以从 directory_old 中删除这些文件。就速度而言,它将与“mv”相同,因为您首先创建链接,然后删除原始链接。但如果这有意义的话,这种方法可以让您从头开始