1. yuya_presto

    Posted

    yuya_presto
Changes in title
+シェルだけで色々こなす、便利なシェル芸
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,96 @@
+
+## シェルだけで、ファイル名だけ変更、またはファイルを一括指定
+
+ファイルパス展開で{a,b,c}記法を使うと、パスの一部(例:ファイル名)だけが違う複数ファイルを簡単に指定できます。
+
+```bash:
+mv /the/long/long/path/to/file /the/long/long/path/to/new_file
+```
+
+これが
+
+```bash:
+mv /the/long/long/path/to/{file,new_file}
+```
+
+と簡単にできます。zshなら補完も可能です。
+ファイル以外でも
+
+ $ echo hoge{fuga,piyo,muga}
+ hogefuga hogepiyo hogemuga
+
+
+## シェルだけで、連番のファイルをまとめて選択
+
+ファイルパス展開で[012]記法を使うと、連番のファイルを選択することができます。
+
+```bash:
+cat /blah1 /blah2 /blah3 /blah4
+```
+
+これが
+
+```bash:
+cat /blah[1234]
+```
+
+と簡単にできます。
+(存在しないファイルはスキップされます。)
+
+## シェルだけで、落ちても自動で再起動
+
+```bash:
+while true; do target_script; sleep 1; done
+```
+
+終了する際はCtrl-Cを連打してください。
+
+## シェルだけで、forループのワンライナー
+
+(これは基本かもしれませんが、なんだかんだで重宝します・・)
+
+```bash:
+for i in `seq 1 100`; do target_script $i; done
+```
+
+## (sedだけど)ほぼシェルだけで一括置換
+
+sed -iを使うと、ファイルの中身を直接書き換えることができます。
+
+```bash:
+sed -i -e 's/some_bad_method_name_or_something/good_one/g' `ag -l some_bad_method_name_or_something ./lib`
+```
+
+ag/ackがない場合はgrep -Rで代用できますが、.gitが置換対象に含まれないよう注意してください
+
+## シェルだけで並列実行
+
+http://stackoverflow.com/questions/5547787/running-shell-script-in-parallel
+
+gnu parallelコマンドを使うか、bashに内蔵されたバックグラウンド実行機能(&やbgコマンドを使うもの)+プロセスの終了待ちをするwaitコマンドを使えば簡単に並列実行できます。
+
+### parallel篇
+
+```bash:
+cat url_list.txt | parallel wget
+```
+
+parallelコマンドは入力を改行で区切り、指定されたコマンドの後ろに付けて実行します。並列実行数はデフォルトでCPU+1個ですが、--jobsで指定もできます。
+
+### bashだけ篇
+
+下記のコードは[stackoverflow](http://stackoverflow.com/questions/5547787/running-shell-script-in-parallel)の引用です。 (Quoted from stackoverflow.)
+
+```bash:
+#!/bin/bash
+for i in $(seq 1 1000)
+do
+ ( Generating random numbers here , sorting and outputting to file$i.txt ) &
+ if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
+done
+wait
+```
+
+さすがに最大ジョブ数で管理することはできず、10個立ち上げたら全部終わるのをまってから、また10個立ち上げて・・という流れになります。
+
+※シェル芸というワードは[こちら](https://twitter.com/usptomo)のtwitterアカウント名から頂きました