環境
やりたいこと
findコマンドを実行して得られたファイルに対してシェルスクリプトを実行する
find -name "*.png" -exec bash -c ' for file do identify -verbose "$file" done ' bash {} +
ChatGPTで生成されたコマンドだけど結構汎用性高そうだったのでメモ
指定した数字の範囲で10で割り切れる数字をランダムに生成したい
100〜500の場合、100,140,230,490とかができるようになってほしい
root@6200ae14e50a:/app# echo {100..500..10} | tr ' ' '\n' | shuf -n 1 480 root@6200ae14e50a:/app# echo {100..500..10} | tr ' ' '\n' | shuf -n 1 330 root@6200ae14e50a:/app# echo {100..500..10} | tr ' ' '\n' | shuf -n 1 310 root@6200ae14e50a:/app# echo {100..500..10} | tr ' ' '\n' | shuf -n 1 360
処理の内容は以下
echo {100..500..10}
は、100から500まで10ずつ増加する数値を空白区切りで出力します。tr ' ' '\n'
は、空白を改行に置換します。shuf -n 1
は、標準入力からランダムに1行を選択して出力します。例えば以下のようなファイルがたくさんあったとする。これをランダムなファイル名に一括変更したい
./my1.txt ./my10.txt ./my11.txt ./my12.txt ./my13.txt ./my14.txt ./my2.txt ./my3.txt ./my4.txt ./my5.txt ./my6.txt ./my7.txt ./my8.txt ./my9.txt
find . -type f -iname "*.txt" -exec bash -c 'mv "$0" "${0%/*}/$(head /dev/urandom | tr -dc "0-9" | head -c 6).txt"' {} \;
実行すると以下のようになる
./200500.txt ./217328.txt ./227527.txt ./228890.txt ./391966.txt ./461458.txt ./540946.txt ./595365.txt ./600386.txt ./780341.txt ./838847.txt ./866032.txt ./899626.txt ./960757.txt
Macで実行するとエラーになってファイル消えるので注意
画像の背景色を変えたい
例えば以下のような画像があったとする。
その場合は以下のコマンドを実行する
convert obake.png -background green -alpha remove -alpha off obake-green.png
すると以下のような画像になる
透過じゃなくて↑みたいな背景色1色の場合 -opaque green -fill red
で緑色を赤色に置き換える -fuzz オプションで色の許容誤差を指定できる
convert obake-green.png -fuzz 1% -fill red -opaque green -flatten obake-red.png
指定した座標(ここでは0,0)から始まる領域を、fillオプションで指定した色に塗りつぶす事もできる。 -fuzz オプションで色の許容誤差を指定できる
convert obake-green.png -fuzz 1% -fill none -draw "matte 0,0 floodfill" -background red -flatten obake-red.png
こんな感じになる
Linux環境で、特定のディレクトリ以下の幅が1350ピクセルでないまたは高さが600ピクセルでないすべてのPNG画像ファイルを削除したい
ファイル名ならfind駆使すれば一発だが、解像度となると画像のメタデータを読まないといけないので厄介
やっぱりImageMagickを使う
find . -type f -iname "*.png" -exec identify -format '%w %h %i\n' {} \; | awk '$1 != 1350 || $2 != 600 {print $3}' | xargs rm
このLinuxコマンドは、現在のディレクトリ(.)とそのすべてのサブディレクトリから、ファイルのみ(-type f)を検索し、ファイル名が.pngであるものだけを選択します(-iname "*.png")。
そして、identifyコマンドを使って、各PNG画像ファイルの幅、高さ、およびファイル名を表示します(-exec identify -format '%w %h %i\n' {} \;)。
この情報は、スペースで区切られた3つの値を含む1行になります。
そして、awkコマンドを使用して、幅が1350ピクセルでない、または高さが600ピクセルでないすべての行について、そのファイル名を表示します($1 != 1350 || $2 != 600 {print $3})。
xargsとrmコマンドを使用して、これらのファイルを削除します。
==使えばいい
awk '$1 == 1350 && $2 == 600 {print $3}'
削除は自己責任で