hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

シェル・ワンライナー160本ノック week2 1.3.f~問題4

1.3.f

xargs

 xargsはコマンドに引数を渡し実行するはたらきをします.以前は出力を横に表示させるはたらきをしていましたが,これはxargsの引数が指定されなかった場合はechoを実行する仕様を使った物です.

1.3.g

bash

 bashをコマンドとして使う事でワンライナー上の出力をコマンドとして実行する事が出来ます.awkを使ってmkdir ...という文字列を出力します.

$ seq 4 | awk '{print "mkdir "($1%2 ? "odd_" : "even_")$1 }'
mkdir odd_1
mkdir even_2
mkdir odd_3
mdkir even_4

これをコマンドとして実行させたいときはこれにbashを付けます.

$ seq 4 | awk '{print "mkdir "($1%2 ? "odd_" : "even_")$1 }' | bash
$ ls -d odd_* even_*
even_2  even_4  odd_1  odd_3

1.4.a

find

 find "探すディレクトリ"とすると,そこに存在するファイルやディレクトリが全て表示されます.これをgrepと組み合わせると検索が可能になります.

問題1

 ファイルに記述された文字列から.exeとかかれた行のみを抜き出す問題でした.grepに検索する文字列を正規表現で表現します.ファイルの指定は末尾に記述します.(これが一番分からなかった)

$ grep '\.exe$' files.txt
test.exe
画面仕様書.xls.exe

 別解と言うほどでもありませんが,files.txtの検索から一括で行う方法を載せます.grep files.txtの出力をxargsで引数として受け取り,grep '\.exe$'とすれば良いです.

$ find shellgei160/ | grep files | xargs grep '\.exe$'
test.exe
画面仕様書.xls.exe

また,問題2で習う$(コマンド)というコマンド置換を使えばこう書けます.

$ find shellgei160/ | grep '\.exe$' $(grep files)
test.exe
画面仕様書.xls.exe

問題3

rename

 renameはファイル名を変更するコマンドです.sedと同じようにs/a/b/で変更します.
 ファイル名が7文字になるように0を先頭に加えるには2つのsedを使います.まずs/^/0000000/で先頭に0を7つ付け加えます.次に後ろ7桁の文字を抽出し,余った先頭の数字を取り除きます.数字7個は正規表現では[0-9]{7}と書きます.文字を取り除くには∅*とします.

ls-U

 lsはファイルをソートして表示します.しかし,大量にファイルが有るとソートするのに時間が掛かります.そのため,-Uというオプションを付ける事でソートせずに出力されます.