在Linux上重命名数百万个文件

时间:2013-11-11 10:35:37

标签: linux rename

我需要重命名大约200万张图片。 文件看起来像image.jpg?arg=value,需要在没有参数的情况下重命名为image.jpg

以下是我目前正在做的事情:

sudo find . -name "*.jpg?*" -exec rename 's/(\?.*)//' {} \;

这可以完成工作但似乎需要永远。有人建议如何加快速度吗?

3 个答案:

答案 0 :(得分:4)

你能试试吗

sudo find . -name "*.jpg*" -print0 | xargs -0 -I '{}' -P4 -n1 rename 's/(\?.*)//' {} \;

来自xargs

的手册页
   --max-procs=max-procs
   -P max-procs
          Run  up  to max-procs processes at a time; the default is 1.  If
          max-procs is 0, xargs will run as many processes as possible  at
          a  time.   Use the -n option with -P; otherwise chances are that
          only one exec will be done.

这里我将最大子进程限制为4.如果你想要更多,那么标记-P0将占用最多可能的子进程,但请记住,你的CPU将会严重超载。

使用gnu parallel

答案 1 :(得分:2)

并行化重命名。启动两个(或三个,四个)shell并运行该命令。请确保以某种方式分离命令的图像,这样就不会在同一图像上运行2个命令。

答案 2 :(得分:0)

我在Ubuntu 14.04上尝试了这个,但它不起作用。命令执行成功但没有任何反应。我认为重命名正则表达式部分是不对的。要检查一下:

<script type="text/javascript">
      window.onbeforeunload = function() {
          $.ajax
            ({ 
                url: 'logout.php',
                data: "",
                type: 'post',
                success: function()
                {
                    .....
                }
            });
      }
</script>

但是将正则表达式改为以下作品。     $ echo Screenshot_from_2015-08-17_122834.png.de4Mzv2 | sed's /.[^.]*$//'     Screenshot_from_2015-08-17_122834.png

在@realspirituals建议的命令中使用它,我有以下文件:

$ echo Screenshot_from_2015-08-17_122834.png.de4Mzv2 | sed 's/(\?.*)//'
Screenshot_from_2015-08-17_122834.png.de4Mzv2