質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

Q&A

解決済

2回答

2326閲覧

ImageMagick で連番のファイルをまとめて処理したい。

noc

総合スコア73

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

0グッド

0クリップ

投稿2020/12/06 03:06

編集2020/12/06 07:02

003.bmp から100.bmp までの連番ファイルがあり、そのうちの偶数の番号のファイルだけを180度回転させたいです。

しかしimagemagickへのパイプの渡し方がわかりません。
imagemagickはパイプに対応していないのでしょうか?

Windonw10 msys2 zsh
Version: ImageMagick 7.0.10-29 Q16 x64 2020-09-05 http://www.imagemagick.org

試したこと。

sh

1seq -f '%03g.bmp' 4 2 100 | magick -rotate 180 2# => MissingArgument `-rotate' at CLI arg 1 @ fatal/magick-cli.c/ProcessCommandOptions/447. 3 4seq -f '%03g.bmp' 4 2 100 | magick - -rotate 180 5# => NoDecodeDelegateForThisImageFormat `' @ error/constitute.c/ReadImage/562. 6 7 8seq -f '%03g.bmp' 4 2 100 | magick convert - -rotate 180 9# convert: NoDecodeDelegateForThisImageFormat `' @ error/constitute.c/ReadImage/562. 10# convert: MissingAnImageFilename `180' @ error/convert.c/ConvertImageCommand/3282. 11 12# eval で複数行のそれぞれを実行させることができないので失敗しているっぽい 13eval $(seq -f '%03g.bmp' 4 2 100 | awk '{print "magick convert " $0 " -rotate 180 " $0}') 14# magick.exe: UnableToOpenBlob 'magick': No such file or directory @ error/blob.c/OpenBlob/3537. 15# magick.exe: NoDecodeDelegateForThisImageFormat `' @ error/constitute.c/ReadImage/562.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

既に解決済との事ですが、別解を出してみます。

zsh

1mogrify -rotate 180 {004..100..2}.bmp

zsh では{n1..n2..n3}という形で、n1からn2までn3刻みでの連番が生成できます。

出力先が入力ファイルと同じでいい(上書きでいい)場合は mogrify コマンドが使えます。
mogrify コマンドは上書きするという動作から、複数の入力ファイルを指定する事が出来ます。

この二つを組み合わせたのが前述の案です。

zsh の連番生成に頼らないのならば以下でしょうか。

sh

1mogrify -rotate 180 $(seq -f '%03g.bmp' 4 2 100)

eval $(seq -f '%03g.bmp' 4 2 100 | awk '{print "magick convert " $0 " -rotate 180 " $0}')

実行したい内容を行単位で出力して、それを順番に実行したい場合は、パイプで sh に渡すといいでしょう。

seq -f '%03g.bmp' 4 2 100 | awk '{print "magick convert " $0 " -rotate 180 " $0}' | sh

| sh無しで実行して内容を確認した後、| shを付けて実行というのを私はよく使います。

あと、eval でエラーになっているのは、改行でコマンドが区切られず一続きのコマンドとして実行される為、magick という対象ファイルが無いからですね。
以下のように各行の最後に;を追加してコマンドの区切りを明示すれば eval でも実行できます。

eval $(seq -f '%03g.bmp' 4 2 100 | awk '{print "magick convert " $0 " -rotate 180 " $0 ";"}')

投稿2020/12/07 12:28

編集2020/12/07 12:40
doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noc

2020/12/07 12:44

ありがとうございます。 シェルの書き方のセオリー的なやり方を教えていただいて、この世界に入ったばかりの者にはとても助かります。 ブレース展開にステップを指定できることは初耳ですし、作ったコマンド行を実行させるには最後に `sh` に渡せばいいというのは今後とても役立てそうです。ありがとうございます。
noc

2020/12/07 12:57 編集

あと、ファイルを直接編集するのなら、`mogrify` 使った方がいいということを知りました。 短く書けることと汎用性があるやり方はいいことなので、両方提示していただいてとても助かります。
guest

0

自己解決

xargs コマンドに渡すことで実現させることができました。

sh

1seq -f '%03g.bmp' 4 2 100 | xargs -I{} magick {} -rotate 180 {}

時間がかかる処理は、-P オプションで同時実行数を増やした方が吉ですね。

sh

1seq -f '%03g.bmp' 4 2 100 | xargs -I{} -P3 magick {} -rotate 180 {}

投稿2020/12/06 06:22

編集2020/12/06 06:28
noc

総合スコア73

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問