第33回シェル芸勉強会をライヴで解いた

今回はテスト前とは言え、時間に余裕があったのでストリームにて、ライヴで問題を解いていきました。

問題はこちら

Q1

$ echo "💩"{/,/,/,/,/,/,/,/,/,} | tr -d ' ' | sed 's/^/mkdir -p /e' 

上のような解答を思いつきましたが、下のほうが短いですね(ほぼほぼ変わらないが)

$ echo "💩/"{,,,,,,,,,} | tr -d ' ' | sed 's/^/mkdir -p /e' 

別解は下です。yeshead の組み合わせはよくやりますよね。

$ yes 💩 | head | tr '\n' '/' | xargs mkdir -p

Q2

/? にエスケープしました。実際に出来たファイルは ? のままですが表示時に変えてしまえばいいでしょう。

$ cowsay Eat American beef | sed 's/^/"/;s/$/"/;s#/#?#g' | awk '{system("sleep 1");print}' | xargs -n1 touch # ファイル生成
$ ls -ltr | sed 's/?/\//' # ごまかして表示

Q3

できない。上田さんによると下で五十音出せるらしい。Shift-JIS の半角カナを経由しているとのこと。後で調べておきたい。

$ echo {176..220} 166 221 | xargs -n1 printf "\\\\\\\\x%x\n" | xargs echo -e | nkf --hiragana

zsh なら簡単。

$ zsh -c 'echo {ア..ワ} ヲ ン' | nkf --hiragana

Q4

できない。install -D も便利という知見を得た(あまり関係ないかも)。

Q5

できない。ファイル名が3つであるのは確かだが…

上田さんの回答により、ls -b | wc -l で出来ることが判明。
一方、find . | wc -l とやると色々と間違い。

-bとか-qオプションとか調べよう。

Q6

やや危険なのが出来た。ブレース展開はもっと危険なので辞めました。ア..ン

$ seq 1000000 | sed 'y/0123456789/あいうえおかきくけこ/' | xargs touch

大量のファイルがあるディレクトリでは ls がすごく遅いので find を使った方が良いとのこと。
ls はファイル・ディレクトリのリストを作ってソート等をしている。find は見つけ次第 print するとのことで、ここで速度の差が出ているのであろう。

Q7

まあ制御コードで。nl の人出現。

$ yes '' | nl -ba -nrz -v 0 -w 7 | head -n1000000 | gsed 'y/0123456789/あいうえおかきくけこ/' | xargs -P4 touch
# nl の人

僕の解答は以下。

$ seq 1000000 | sed 'y/0123456789/^A^B^D^E^F^G^H^I^K^L/' | xargs -P2 touch

Q8

もう滅茶苦茶。でも完全自力なので達成感はすごい()。

$ find . | sed 1d | xxd | sed 's/0a/58/g' | xxd -r | grep -o '\./X*' | sed 's/X$//g' | awk '{match($0, /X+/);print "echo " RLENGTH " | cat >" $0}' | sed "s/X/$'\\\n'/g" | bash

参考