【問題と解答】jus共催 第33回めでたいシェル芸勉強会
Sat Jan 27 18:37:54 JST 2018 (modified: Sat Jan 27 18:40:16 JST 2018)
views: 3893, keywords:プログラミング,勉強会,シェル芸,シェル芸勉強会 この記事は最終更新日が7年以上前のものです。
- 問題で使われているデータファイルはGitHubにあります。クローンは以下のようにお願いします。
$ git clone https://github.com/ryuichiueda/ShellGeiData.git- 環境: 解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールすると、GNUのコマンドが使えます。BSD系の人は玄人なので各自対応のこと。
Q1
適当にディレクトリを作り、その中で tree したら次のような出力が得られるようにしてください。(日本語環境でないとうまくいかないのでご了承ください。)
$ tree
.
└── 💩
└── 💩
└── 💩
└── 💩
└── 💩
└── 💩
└── 💩
└── 💩
└── 💩
└── 💩解答
$ echo '💩/' | perl -nle 'print $_ x 10' | xargs mkdir -pQ2
次のような出力を得てください。
合計 0
-rw-rw-r-- 1 ueda ueda 0 1月 26 12:06 ___________________
-rw-rw-r-- 1 ueda ueda 0 1月 26 12:06 < Eat American beef >
-rw-rw-r-- 1 ueda ueda 0 1月 26 12:06 -------------------
-rw-rw-r-- 1 ueda ueda 0 1月 26 12:06 \ ^__^
-rw-rw-r-- 1 ueda ueda 0 1月 26 12:06 \ (oo)\_______
-rw-rw-r-- 1 ueda ueda 0 1月 26 12:06 (__)\ )\/\
-rw-rw-r-- 1 ueda ueda 0 1月 26 12:06 ||----w |
-rw-rw-r-- 1 ueda ueda 0 1月 26 12:06 || ||解答
$ cowsay 'Eat American beef' | sed "s/^/\'/" | sed "s/$/\'/" |
sed 's;/;@;' | awk '{print ;system("sleep 1")}' |
xargs -n1 touch ; ls -trl | sed 's;@;/;g'Q3
空のディレクトリを用意して、その中に、次のようにファイルを10個置いてください。中身は空で構いません。ちょっと都合が良い条件ですが、「touch あいうえお・・・」とベタ打ちするのは禁止でお願いします(数個ひらがなや全角文字を打つのは可)。
$ ls
あいうえお さしすせそ なにぬねの まみむめも らりるれろ
かきくけこ たちつてと はひふへほ や ゆ よ わをん解答
$ echo {177..220} 166 221 | tr ' ' '\n' | xargs -n1 printf "\\\\\\\\x%x\n"
| xargs echo -e | tr -d ' ' | nkf --hiragana | sed 's/[やゆ]/& /g' |
sed 's/ら/\n&/' | fold -b15 | xargs touchQ4
https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.33/kiken の中にあるファイルについて、ファイル名とファイルの中身を入れ替えてください。スラッシュがある場合にはディレクトリを作ってください。ワンライナー中でファイル名やファイルの中身を直接使わないでください。
解答
$ ls | while read f ; do echo $f > "$(cat $f)" ||
( mkdir -p $(dirname $(cat $f)) && echo $f > $(cat $f) ) ; rm $f ; doneQ5
https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.33/yabai の中にあるファイルの数を数えてください。
解答
普通にやろうとすると間違えます。(環境依存かもしれません。)
$ ls | wc -l
46正解例はこちらです。
$ ls -b | wc -l
3Q6
何かディレクトリを作って、その中に100万個ファイルを作ってください。ファイルの名前に使えるのはひらがな、漢字、カタカナのいずれかとします。
解答
$ seq 0 999999 | sed 'y/0123456789/あいうえおかきくけこ/' | xargs -P2 touchQ7
ファイル名が半角スペース等、見えない字で構成されるファイルを100万個作ってください。
解答
sed yの置換後の空白は、半角スペース+全角スペースです。
$ seq 1000000 | sed '1iobase=2;ibase=10' | bc | sed 'y/01/ /' |
sed "s/^/\'/" | sed "s/$/\'/" | xargs touchQ8
yabaiディレクトリの中の各ファイルに、各ファイル名の改行の数(=ファイル名の長さ)を書き込んでください。ワンライナーなら何を使っても良いです。 bashにこだわると解けないかもしれません。
解答
bashは断念。perlで。
$ perl -e '@a=glob("*"); foreach $v(@a){open(f,">",$v) or die "!";print f;print f length($v);print f "\n"}'
### 確認(・・・になってないような気もしないでもない) ###
$ cat *
4
7
32
$ ls -l
合計 12
-rw-rw-r-- 1 ueda ueda 2 1月 26 10:54 ????
-rw-rw-r-- 1 ueda ueda 2 1月 26 10:54 ???????
-rw-rw-r-- 1 ueda ueda 3 1月 26 10:54 ????????????????????????????????すみませんすみません!!!!!
Q8 $ for i in *;do echo ${#i} > "$i";done#シェル芸
— eban (@eban) 2018年1月27日
ノート
Tweet