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

Rya*_*yan 15 linux performance rsync mv file-io

我有一百万个图像需要从一个本地目录移动到另一个本地目录,占用 30GB 的磁盘空间。

什么是最有效的方法来做到这一点?使用mv? 使用cp? 使用rsync? 还有什么?

我需要采取这些:

/path/to/old-img-dir/*
                     00000000.jpg
                     --------.jpg  ## nearly 1M of them! ##
                     ZZZZZZZZ.jpg
Run Code Online (Sandbox Code Playgroud)

并将它们移到此处:

/path/to/new/img/dir/
Run Code Online (Sandbox Code Playgroud)

Ric*_*ard 29

rsync 将是一个糟糕的选择,因为它做了大量的客户端/服务器后台工作,其中包括本地和远程系统。

mv可能是最好的选择。如果可能,您应该尝试mv directory_old directory_new而不是mv directory_old/* directory_new/. 通过这种方式,您可以移动一件事而不是一百万件。

  • +1 建议移动目录而不是文件。 (6认同)
  • rsync 可以很好地处理本地存储介质上的传输。它强制执行诸如 --whole-file 之类的事情(删除 delta xfer 算法的实现),并防止诸如 --compression 之类的其他事情在本地传输中不起作用。如果目录驻留在不同的文件系统上,'mv' 将不会提供任何类型的性能。如果它们确实驻留在同一个文件系统上,那么只需像这些人所说的那样“mv”目录。 (6认同)
  • 另外,如果我们谈论的是数百万,通配符扩展可能会破坏 `mv` 支持的最大参数。 (4认同)

Raú*_*udo 14

find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
Run Code Online (Sandbox Code Playgroud)
  • 这不会溢出参数扩展。
  • 如果需要,您可以指定文件扩展名。(-姓名 ...)
  • find -print0withxargs -0允许您在名称中使用空格。
  • xargs -rmv除非有东西要移动,否则不会运行。(mv如果没有提供源文件会抱怨)。
  • 该语法mv -t允许您首先指定目标文件,然后指定xargs.
  • 移动整个目录当然要快得多,因为无论其中包含多少文件,它都会在恒定时间内发生,但是:
    • 源目录将消失一小段时间,这可能会给您带来问题;
    • 如果进程使用当前目录作为输出目录(与始终引用来自非移动位置的完整路径相反),则必须重新启动它。(就像您对日志轮换所做的那样)。

顺便问一下,我是否真的需要一次移动如此大量的文件。批处理被高估了。如果我可以在事物产生的那一刻处理它们,我会尽量不积累大量的工作。


Uta*_*ead 9

如果两个目录驻留在同一个文件系统上,请使用mvDIRECTORY 而不是目录的内容。

如果它们驻留在两个不同的文件系统上,请使用 rsync:

rsync -av /source/directory/ /destination

注意/源头的尾随。这意味着它将复制目录的内容而不是目录本身。如果您不/关闭,它仍会复制文件,但它们将位于名为/destination/directory. 使用 /,文件将位于/destination

rsync如果您以 root 身份运行它或者文件归您所有,则将保持文件所有权。它还将维护mtime每个单独的文件。

  • 为了将一个大文件夹从一个硬盘驱动器复制到另一个硬盘驱动器,`rsync` 似乎围绕着 `mv` 运行。谢谢你的提示! (2认同)