1

我需要重命名大约 200 万张图像。文件看起来像这样image.jpg?arg=value,需要重命名为image.jpg不带参数。

这是我目前正在做的事情:

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

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

4

3 回答 3

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并行

于 2013-11-11T10:43:28.173 回答
2

并行化重命名。启动两个(或三个、四个)shell 并运行命令。确保您以某种方式分隔命令的图像,以便不会在相同的图像上运行 2 个命令。

于 2013-11-11T10:49:18.837 回答
0

我在 Ubuntu 14.04 上试过这个,但它不起作用。命令执行成功,但什么也没发生。我认为重命名正则表达式部分不正确。要检查这一点:

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

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

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

$ ls -ltr
Screenshot_from_2015-08-19_114601.png.somegthingy 
Screenshot_from_2015-08-17_122834.png.de4Mzv2 
Screenshot_from_2015-08-17_122455.png.ac84Lk1
Screenshot_from_2015-08-13_154012.png.uNl34sH 
Screenshot_from_2015-08-13_101459.png.53rv1ce 
Screenshot_from_2015-08-13_101437.png.l4Pt0pz 
Screenshot_from_2015-08-13_101230.png.p31Ic4n

$ sudo find . -name "*.png*" -type f -print0 | xargs -0 -I {} -P4 -n1 rename 's/\.[^\.]*$//' {} \;
Screenshot_from_2015-08-19_114601.png 
Screenshot_from_2015-08-17_122834.png 
Screenshot_from_2015-08-17_122455.png
Screenshot_from_2015-08-13_154012.png 
Screenshot_from_2015-08-13_101459.png 
Screenshot_from_2015-08-13_101437.png 
Screenshot_from_2015-08-13_101230.png
于 2015-09-25T10:16:13.963 回答