動かざることバグの如し

近づきたいよ 君の理想に

Linuxで10で割り切れる乱数を生成したい

環境

やりたいこと

指定した数字の範囲で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

処理の内容は以下

  1. echo {100..500..10} は、100から500まで10ずつ増加する数値を空白区切りで出力します。
  2. tr ' ' '\n' は、空白を改行に置換します。
  3. shuf -n 1 は、標準入力からランダムに1行を選択して出力します。

Linuxでファイル名をランダムに一括変更するコマンド

環境

やりたいこと

例えば以下のようなファイルがたくさんあったとする。これをランダムなファイル名に一括変更したい

./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で実行するとエラーになってファイル消えるので注意

ImageMagickで背景色を別の色に変更する方法

環境

やりたいこと

画像の背景色を変えたい

背景が透過されている場合

例えば以下のような画像があったとする。

picture 1

その場合は以下のコマンドを実行する

convert obake.png -background green -alpha remove -alpha off obake-green.png

すると以下のような画像になる

picture 2

指定した背景色を別の色に塗りつぶしたい場合

透過じゃなくて↑みたいな背景色1色の場合 -opaque green -fill red で緑色を赤色に置き換える -fuzz オプションで色の許容誤差を指定できる

convert obake-green.png -fuzz 1% -fill red -opaque green -flatten obake-red.png

picture 3

指定した座標の色を別の色に塗りつぶしたい場合

指定した座標(ここでは0,0)から始まる領域を、fillオプションで指定した色に塗りつぶす事もできる。 -fuzz オプションで色の許容誤差を指定できる

convert obake-green.png -fuzz 1% -fill none -draw "matte 0,0 floodfill" -background red -flatten obake-red.png

こんな感じになる

picture 4

参考リンク

Linuxで特定の解像度以外の画像を探して全削除するコマンド

やりたいこと

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}'

最後に

削除は自己責任で