移动驻留在单个目录中的大量文件的最有效方法是什么?


11

CentOS 5.x

如果这是一个重复的问题,我深表歉意。我见过很多类似的问题(关于删除文件),但情况并不完全相同。

我有一个包含成千上万个文件的目录(可能超过一百万个),作为对一个不同问题的短期修复,我需要将这些文件移动到另一个位置。

为了讨论的目的,假设这些文件最初位于其中/home/foo/bulk/,我想将它们移至/home/foo2/bulk2/

如果尝试mv /home/foo/bulk/* /home/foo2/bulk2/ ,会出现“参数过多”错误。

Google先生告诉我,批量删除文件的另一种方法是运行find。就像是: find . -name "*.pdf" -maxdepth 1 -print0 | xargs -0 rm

如果我要删除内容,那很好,但是在这种情况下,我想移动文件...如果我输入类似find . -name "*" -maxdepth 1 -print0 | xargs -0 mv /home/foo2/bulk2/bash的内容,则抱怨该文件不是目录。

在此处将批量文件从一个目录移动到另一个目录的最佳命令是什么?

Answers:


16

利用GNU mv-t选项来指定目标目录,而不是依赖最后一个参数:

find . -name "*" -maxdepth 1 -exec mv -t /home/foo2/bulk2 {} +

如果您使用的系统没有此选项,则可以使用中间外壳程序以正确的顺序获取参数(find … -exec … +不支持在文件列表之后放置额外的参数)。

find . -name "*" -maxdepth 1 -exec sh -c 'mv "$@" "$0"' /home/foo2/bulk2 {} +

您可以使用find ... -exec sh -c'等等“ $ @” blah sh {} +“(“ shell技巧”)来处理有关参数顺序的问题。在findutils中有一些这样的示例(信息)文档;搜索“ sh -c”
James Youngman 2013年

5

考虑mv使用父目录而不是文件:

mv /home/foo/bulk /home/foo2/bulk2 && mkdir /home/foo/bulk

(但是,如果/home/foo/bulk必须时刻存在,则可能会引起问题。)


1
我还要补充一点,以防万一您的目标目录存在,将目标目录中的文件移动到源目录(大目录)并重命名目录。
sbenitezb

谢谢-很好的建议。在这种情况下,目录必须随时存在。好主意。
Mike B

我不得不承认我不明白这个答案的作用。为什么mkdir呢 那么该目录是否“每时每刻都存在”呢?为什么这会加快速度?
莫妮卡·赫德内克

我知道这条评论已有1年的历史,但最近一条是5年的历史,所以我认为我也可以回答...您的前两个问题是相关的。之所以这样,mkdir是因为整个文件夹及其中的所有内容都将移至另一个目录,并且不再存在于旧目录中。它确保旧目录仍然存在。但是,如果有一个服务始终在运行,而该服务依赖于始终存在的第一个目录,那将是不够的,因为先移动然后再创建它。它并没有使任何事情变得更快,只是通过提供更少的参数而变得更加简单。
卢卡斯·勒布朗

0

仅出于多样性,我喜欢在某些情况下使用cpio。

find tmp |cpio -v  -p --make-directories --sparse tmp2

1
如果源和目标位于同一文件系统上,则此方法可能效率很低(不必要的复制)。同样,总是最好使用-print0-0选项。
pabouk

0

使用GNU mv

find . -mindepth 1 -exec mv -t /tmp {} +

在OS X之类的没有mv -t但确实有-print0和的系统上xargs -0

find . -mindepth 1 -print0|xargs -0 -I, mv , /tmp

或者,如果文件名不包含空格,引号,反斜杠或换行符(使用OS X xargs)或引号,反斜杠或换行符(使用GNU xargs):

ls|xargs -I, mv , /tmp

-3

在指定的时间内尝试以下操作:

find . -name "*" -type f -mtime +7 -exec mv -t /folder/to/transfer/files {} +
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.