我需要重命名大约 200 万张图像。文件看起来像这样image.jpg?arg=value
,需要重命名为image.jpg
不带参数。
这是我目前正在做的事情:
sudo find . -name "*.jpg?*" -exec rename 's/(\?.*)//' {} \;
这可以完成工作,但似乎需要永远。有人对如何加快速度有建议吗?
你能试一下吗
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并行
并行化重命名。启动两个(或三个、四个)shell 并运行命令。确保您以某种方式分隔命令的图像,以便不会在相同的图像上运行 2 个命令。
我在 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