約 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/(\?.*)//' {} \;
のmanページから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パラレルを使用する
名前の変更を並列化します。2 つ (または 3 つ、4 つ) のシェルを開始し、コマンドを実行します。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