はじめに
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では、各ポジションを募集しています。興味ある方は覗いてみてください。