generated at
ゆるふわシェル問題 その2
2020/3/20にシェル芸botに突発的に投下したシェル問題集
全部で8問
そんなに難しくないはず
だいたい1コマンドで解ける

使う技術

問題

Q1 1コマンドで所有者、所有グループをwww-data、権限を0750に指定しつつ/workディレクトリを作成してください

a1.sh
install -d -o www-data -g www-data -m 0750 /work
問題の意図
1コマンドで権限を設定する方法を把握する
chmod, chownを別コマンドで実行するのは事故を誘発するので、1コマンドで設定できる方法を使うほうが安全
解説
-d ディレクトリを作成する
-o 所有者(owner)の設定
-g 所有グループ(group)の設定
-m read/write/executeの権限(mode)の設定

Q2 以下のファイルのファイル名末尾の日付をファイル名の先頭に入れ替えた名前にリネームしてください
q2.sh
touch web.log.2020-01-0{1..3} touch db.log.2020-01-0{1..3} touch app.log.2020-01-0{1..3} ls *log*
> 2020-01-01_web.log

a2.sh
ls | sed -E 's/^(web|db|app)\.(log)\.(.*)/mv & \3_\1.\2/g' | bash ls *log*
問題の意図
ファイル名の部分修正や入れ替えを大量のファイルに対して実施することは度々ある
正規表現を組み合わせたリネームの方法を把握する
解説
正規表現でファイル名を場所ごとにグルーピング
置換後の文字列で mv のコマンド列を生成
生成したコマンド列を bash に食わせてシェルを実行

Q3 現在日時の7日前の日付をyyyy-mm-dd形式で出力してください
a3.sh
date -d "7 days ago" +%Y-%m-%d
問題の意図
特定の日付を出力する方法を把握する
ログローテートみたいな処理でN日前のデータを操作したくなることは度々ある
解説
-d 日時の指定
+%Y-%m-%d 日付の書式の指定

Q4 以下のファイルをファイル名に含まれる数値の降順に出力してください
q4.sh
touch yurufuwa_{1..11}.txt ls yuru*.txt

a5.sh
ls yuru*.txt | sort -t _ -rnk2
問題の意図
0埋めされていないデータをソートする方法を把握する
データ数の上限が分かってるときは0埋めするように予め作っておいたほうが楽
解説
-t 数値の直前に _ があるので、それを区切り文字として指定
-n 数値ソート
-k2 2列目をソートのキーに指定
-r 降順ソート。デフォルトは昇順なので反転する

Q5 以下のテキストファイルaの内、重複する行のみ出力してください
q5.sh
cat << EOS | tee a a b a c d b e EOS

a5.sh
cat a | sort | uniq -d

問題の意図
重複してるデータだけ探したいときは度々あるから
解説
uniq は前提として sort されたデータに対して実行しないときちんとユニークにしてくれない
sort uniq はほぼセットで使う
-d で重複してるデータのみ出力する

Q6 寿司という漢字を使わずに寿司と出力してください
a6.sh
echo -e $'\U5BFF\U53F8'

問題の意図
他の人がどういう回答をだすか気になった
解説
16進数で寿司

Q7 muscularというNode.jsプログラムのpackage.jsonのみを探して出力してください。muscular/node_modules配下のpackage.jsonは出力しないでください
a7.sh
find / -maxdepth 7 -name 'package.json' | grep muscular find / -name 'package.json' | grep muscular | grep -Ev "(node_modules).*\1"

問題の意図
ファイルがどこにあるかわからないときの調査方法を把握する
ファイルを探すときはだいたい find grep を組み合わせる
解説
特にいうことがない

Q8 中身はなんでもいいので1MBのファイルを作成してください
a8.sh
dd if=/dev/zero of=a.dat bs=1MB count=1
問題の意図
ダミーデータを作る方法を把握する
巨大なファイルを作ってテストしたりするときに使ったりする
解説
dd ではデータをコピーしてファイルやデバイスに書き込んだりできる
書き込むときに書き込むサイズと、回数を指定できる

以上

余談
sortuniqを使った簡単な問題が思いついたので満足