如何在目录中移动/复制大量文件(而不是所有文件)?

时间:2011-04-05 03:34:32

标签: linux copy command move

我有一个目录,其中包含大约9000个文件,文件名以升序编号(但不一定是连续的)。

现在我需要将数字xxxx中的~3000个文件复制/移动到另一个数字yyyy。如何为此目的使用cp或mv命令?

3 个答案:

答案 0 :(得分:3)

find -type f | while read file; do if [ "$file" -ge xxxx -o "$file" -le yyyy ]; then echo $file; fi; done | xargs cp -t /destination/

如果要限制为3000个文件,请执行以下操作:

export i=0; find -type f | while read file; do if [ "$file" -ge xxxx -o "$file" -le yyyy ]; then echo $file; let i+=1; fi; if [ $i -gt 3000 ]; then break; fi; done | xargs cp -t /destination/

如果文件后面有一个共同的后缀,请在if中使用$ {file %% suffix}(你可以在后缀中使用globs)。

答案 1 :(得分:1)

这不是最优雅的,但是如下:

cp 462[5-9] 46[3-9]? 4[7-9]?? 5??? 6[0-2]?? 63[0-4]? 635[0-3]  otherDirectory

会将名为4625到6353的文件复制到otherDirectory。 (您不希望使用4*之类的内容,因为这会复制文件442483等。)

答案 2 :(得分:1)

您可以使用seq实用程序为此类操作生成数字:

for i in `seq 4073 7843` ; do cp file_${i}_name.png /destination/folder ; done

在缺点方面,这将比QuantumMechanic的解决方案更频繁地执行cp;但如果所有文件名的总长度大于内核的argv大小限制(可能介于128K和2048K之间,取决于您的内核版本和堆栈大小的限制;请参阅{{1),QuantumMechanic的解决方案可能无法执行详情)。

如果您想要的范围跨越数量级(例如,在execve(2)900之间),则1010选项可能有用,它会对输出数字进行零填充。