今回はテスト前とは言え、時間に余裕があったのでストリームにて、ライヴで問題を解いていきました。
Q1
$ echo "💩"{/,/,/,/,/,/,/,/,/,} | tr -d ' ' | sed 's/^/mkdir -p /e'
上のような解答を思いつきましたが、下のほうが短いですね(ほぼほぼ変わらないが)
$ echo "💩/"{,,,,,,,,,} | tr -d ' ' | sed 's/^/mkdir -p /e'
別解は下です。yes
と head
の組み合わせはよくやりますよね。
$ 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