在 Linux 中将一百万张图像从一个目录移动到另一个目录的最快方法是什么?

在 Linux 中将一百万张图像从一个目录移动到另一个目录的最快方法是什么?

我有一百万张图像占用了 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 -print0withxargs -0允许您在名称中使用空格。
  • xargs -rmv除非有东西需要移动,否则不会运行。(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”相同,因为您首先创建链接,然后删除原始链接。但如果这有意义的话,这种方法可以让您从头开始

相关内容