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

发布于 2024-10-30 17:26:41 字数 128 浏览 1 评论 0原文

我得到一个目录,其中包含大约 9000 个文件,文件名按升序排列(但不一定是连续的)。

现在我需要将大约 3000 个文件从编号 xxxx 复制/移动到编号 yyyy 到另一个目录。如何使用 cp 或 mv 命令来实现此目的?

I got a directory which contains approx 9000 files, the file names are in ascending number (however not necessarily consecutive).

Now I need to copy/move ~3000 files from number xxxx to number yyyy to another direcotory. How can I use cp or mv command for that purpose?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

能否归途做我良人 2024-11-06 17:26:41
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} (您可以在后缀中使用 glob)。

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

If you want to limit to 3000 files, do:

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 the files have a common suffix after the number, use ${file%%suffix} inside the if (you can use globs in the suffix).

清风疏影 2024-11-06 17:26:41

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

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

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

如果您想要的范围跨越几个数量级(例如,在 9001010 之间),那么 seq -w 选项可能有用,它为零- 填充输出数字。

You can use the seq utility to generate numbers for this kind of operation:

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

On the downside, this will execute cp a lot more often than QuantumMechanic's solution; but QuantumMechanic's solution may not execute if the total length of all the filenames is greater than the kernel's argv size limitation (which could be between 128K and 2048K, depending upon your kernel version and stack-size rlimits; see execve(2) for details).

If the range you want spans orders of magnitudes (e.g., between 900 and 1010) then the seq -w option may be useful, it zero-pads the output numbers.

溺孤伤于心 2024-11-06 17:26:41

这不是最优雅的,但是像这样的东西怎么样:

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 等)

This isn't the most elegant, but how about something like:

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

which would copy files named 4625 to 6353 inclusive to otherDirectory. (You wouldn't want to use something like 4* since that would copy the file 4, 42, 483, etc.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文