spacelyのブログ

Spacely Engineer's Blog

bashで回せ!!!

はじめに

spacelyでEMとかなにとかやっている いちろー です。 結構shell scriptとか one liner で、何かをグルグル回す事って多いと思います。 その方法をいろいろと並べてみようと思います。

n回回せ!!!

seqを使う方法

seq commandの出力を使います。

for f in $(seq 0 99); do 
    echo ${f} 
done

C的な記法で回す

Cっぽいforの書き方で回せます。

for (( i=0; i<100; i++ )); do
    echo $i
done

rangeっぽい記法で回す

rangeっぽいオブジェクトを作って回せます。

for f in {0..99}; do
    echo ${f}
done

見付けて回せ!!!

globで回す方法

どこかファイル名が一致する部分がある時にglobで引っ掛けて回します。

for f in *.zip; do
    echo "${f}"
done

findをIFSを変更して使う方法

findで条件に見付かるファイルを見付けて回します。 ちなみにIFS(Internal Filed Separator)を改行に変更しないとスペースセパレートになり、ファイル名にスペースを含むファイルがあった場合の挙動が想定と異なる(1ファイル名として扱われる)ようになります。

IFS=$'\n'
for f in $(find . -type f); do
    echo "${f}"
done
unset IFS

findをreadを利用して使う方法

findで条件に見付かるファイルを見付けて回します。 こちらは、whileとreadを組み合わせてみます。

find . -type f | while read -r f; do
    echo "${f}"
done

CPUを使い倒して回せ!!!

今のCPUはpeak性能はあまり変わらなくなり、core数を増やす事により速度を上げる方向に進んでいます。という事は、pipeとかを使わない単純な処理に関してはcoreが使われておらずもったい無いです。 そこで、1処理が重い処理をn回行なう場合は、coreをあるだけ並列に利用しましょう。

これをやるには gnu parallel が必要になりますので、portsなりaptなりで入れてください。

Google Play MusicからYoutube Musicへとサービスが変わり、非常に使いづらかったので、先日、前のサービス時代にuploadしたaudio fileをtakeout.google.com を使ってdownloadしました。 これが、そのファイルの一覧です。

vikke@shincho:~/Dropbox/アプリ/Google Download Your Data
$  ls -lh *.zip | head -n 10
-r-xr-xr-x 1 root root 2.1G  1月 20 02:52 takeout-20240119T172122Z-001.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 02:52 takeout-20240119T172122Z-002.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 02:57 takeout-20240119T172122Z-003.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 02:51 takeout-20240119T172122Z-004.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 03:05 takeout-20240119T172122Z-005.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 03:10 takeout-20240119T172122Z-006.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 03:11 takeout-20240119T172122Z-007.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 02:58 takeout-20240119T172122Z-008.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 03:04 takeout-20240119T172122Z-009.zip
-r-xr-xr-x 1 root root 2.1G  1月 20 02:58 takeout-20240119T172122Z-010.zip

2G超のファイルが145個あります。これを普通にunzipするよりは、coreを使って並列に実行した方が圧倒的に速いです。

ls *.zip | parallel -a - unzip -d "/mnt/d/tmp/{}" "{}"

最後に

みなさんも bash でグルグル回しましょう。 spacelyでは、各ポジションを募集しています。興味ある方は覗いてみてください。