我有一个目录,其中包含大约9000个文件,文件名以升序编号(但不一定是连续的)。
现在我需要将数字xxxx中的~3000个文件复制/移动到另一个数字yyyy。如何为此目的使用cp或mv命令?
答案 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*
之类的内容,因为这会复制文件4
,42
,483
等。)
答案 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
选项可能有用,它会对输出数字进行零填充。