如何在没有参数列表太长的情况下移动多个文件?

Posted

技术标签:

【中文标题】如何在没有参数列表太长的情况下移动多个文件?【英文标题】:How can I move many files without having Argument list too long? 【发布时间】:2016-04-14 02:37:57 【问题描述】:

我正在尝试将大约 700,000 个 .jpg 文件从我的 Ubuntu 服务器中的一个目录移动到另一个目录。我尝试了以下方法:

xargs mv *  -t /var/www/html/

echo (*.jpg|*.png|*.bmp) | xargs mv -t /var/www/html/

echo (*.jpg) | xargs mv -t /var/www/html/

find . -name "*.jpg" -print0 | xargs mv * ../

他们都给我同样的错误:/usr/bin/xargs: Argument list too long

我该怎么办?请帮帮我。谢谢:)

【问题讨论】:

相关:Does "argument list too long" restriction apply to shell builtins? 【参考方案1】:

试试:

find /path/to/old-directory -type f | xargs -i mv "" /path/to/new-directory

【讨论】:

【参考方案2】:

你可以尝试:

 for f in *.jpg do;
   mv -tv $f /var/www/html/
 done
 for f in *.png do;
   mv -tv $f /var/www/html/
 done
 for f in *.bmp do;
   mv -tv $f /var/www/html/
 done

另外,你应该仔细阅读xargs(1);我强烈怀疑

 find . -name "*.jpg" -print0 | xargs -n 1000 -I '' mv ''  ../

应该适合你

最后,进一步了解rename(1)。对这份工作来说可能就足够了。

【讨论】:

在树莓派上我玩过这个命令,当分号被移动到'do'关键字之前它开始工作,所以命令看起来像这样:“for f in *.jpg; do mv -f $f /var/www/html/jpgs/; 完成”【参考方案3】:

如果您使用find,我建议您使用-exec 属性。所以你的结果应该是find . -name "*.jpg" -exec mv /home/new/location \;

但是我建议检查find 命令返回的内容,将exec 部分替换为:-exec ls -lrt \;

【讨论】:

以上是关于如何在没有参数列表太长的情况下移动多个文件?的主要内容,如果未能解决你的问题,请参考以下文章

无法退出太长的列表

捕获太长的表单提交

使用 find 命令删除一组目录,而不会遇到太长的参数列表

当“参数列表太长”时如何删除所有超过 3 天的文件?

列表中的多个参数。没有类如何创建?

XmlReader - 如何在没有 System.OutOfMemoryException 的情况下读取元素中很长的字符串