Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー160本ノック問題115

問題115 USBメモリのアンマウント

USBメモリのマウントとアンマウントをワンライナーで実行する問題だった。デバイスファイルとどう紐づいているかをまず調べなければならないだろうとは思ったが何のコマンドで調べればいいかわからずじまいだった。わかったとしてどうマウントすればいいかも考えてみたがよくわからないままで終わった。

解答例は

lsblk -o KNAME,FSTYPE,MOUNTPOINT | awk 'NF==2' | grep fat | awk '{P="/mnt/disk"NR; print "mkdir -p "P" ;mount -t vfat /dev/"$1,P}' | sudo sh -v
df | grep '/mnt/disk' | awk '{print "umount "$1}' | sudo sh -v

となる。前半のマウント処理については、まずlsblkというコマンドで接続しているデバイスの情報を出力できる。デバイスファイル名、ファイルシステム名、そしてマウント先を出力している。そのあとマウント先のない行だけをawkで抜き出して念のためgrepでさらに絞っている。そのあとawkでマウント先のディレクトリを作成してそこにマウントをしている。Pにマウント先のディレクトリ名を代入しておく。mkdirの-pはディレクトリが存在してもエラーを返さず、必要に応じて親ディレクトリも作成するオプションだ。

アンマウントはdfでマウント済みのデバイスファイルを列挙してうまくやっているみたいだが何をしているのかいまいちよくわからなかった。/mnt/diskにマウントしているのにアンマウントは/dev/diskになるのがよくわからない。