85933


Linux初心者です。  
Terminalでたくさんの画像ファイルがあるディレクトリまでいき、そこにある.pngファイルの名前とサイズだけを出力するにはどうしたら良いでしょう？  
より具体的には：

[code]

    #!/bin/sh
    
    for f in *.png; do file $f; done >> result.txt
    
[/code]

上記のコードを走らせると

[code]

    img1.png: PNG image data, 1406 x 248, 8-bit/color RGBA, non-interlaced
    img2.png: PNG image data, 2048 x 1556, 8-bit/color RGBA, non-interlaced
    img3.png: PNG image data, 977 x 535, 8-bit/color RGBA, non-interlaced
    ....
    
[/code]

のような出力値がresult.txtにセーブされます。この時、画像の名前とサイズだけが欲しいので

[code]

    img1.png: 1406 x 248
    img2.png: 2048 x 1556
    img3.png: 2048 x 1556
    ....
    
[/code]

このようなフォーマットにしたいのです。  
あと特定のサイズのものだけ保存するにはどうしたらいいかもご存じでしたら教えてください。例えば2048 x
1556のサイズのものだけを出力してセーブしたいので、img1.pngは出力せずに

[code]

    img2.png: 2048 x 1556
    img3.png: 2048 x 1556
    ....
    
[/code]

のような形にしたいのです。どうすれば良いでしょうか？教えていただければ幸いです。


CC BY-SA 4.0
2022-01-25T17:19:44.430
85929
2022-01-26T07:43:01.560
35503
question
linux bash command-line
Linuxのfile commandで欲しいものだけprintするには。あと、printしたものでフィルターをかけるにはどうしたら良いでしょう？


> そこにある.pngファイルの名前とサイズだけを出力する
[code]

    file *.png | awk -F'[,:] *' '{print $1 ": " $3}'
    
[/code]

ImageMagick がインストールされている場合

[code]

    identify -format '%f: %w x %h\n' *.png
    
[/code]

> 特定のサイズのものだけ保存する … 例えば2048 x 1556のサイズのものだけを出力してセーブしたい
[code]

    file *.png | awk -F'[,:] *' '$3=="2048 x 1556"{print $1 ": " $3}' > result.txt
    
[/code]

ImageMagick がインストールされている場合

[code]

    identify -format '%f: %w x %h\n' *.png | grep -E ': 2048 x 1556$' > result.txt
    
[/code]


CC BY-SA 4.0
2022-01-25T23:13:17.037
85933
2022-01-26T00:31:32.260
2022-01-26T00:31:32.260
47127
47127
85929
answer


UNIX系 OSでは cutコマンドでテキスト切り出しが可能。  
ただし `':'` と `','`の複数指定などはできないため @metropolisさんの回答のように
awkなど少し汎用性のあるコマンドを用いることになり, さらに複雑になってくるとさらに汎用性の高いスクリプト言語用いることになります。

cutと sed使う例

[code]

    $ file *.png |cut -d, -f-2 |sed 's/PNG image data, //'
    
    # 解像度選択の場合 (検索だけなら --color指定は必要ない)
    $ file *.png |cut -d, -f-2 |sed 's/PNG image data, //' |grep --color=always -w '2048.*1556'
    
[/code]

上記では `20480` などもヒットしそうだけど, そんなデータが無いのならたいていうまく行くはず  
縦横の順番関係なく, ワード単位で検索なら以下のようにも可能です

[code]

    |grep -w 2048 |grep -w 1556   # and検索
    
    grep -w -e 2048 -e 1556   # or検索の場合
    
[/code]

参考:

  * [cutコマンドの使い方](http://x68000.q-e-d.net/%7E68user/unix/pickup?cut)
  * [GNU sed live editor](https://sed.js.org/)
  * [GNU grep live editor](https://grep.js.org/)


CC BY-SA 4.0
2022-01-26T04:56:04.887
85940
2022-01-26T07:43:01.560
2022-01-26T07:43:01.560
43025
43025
85929
answer