Bash > ワンライナー(one liner)スクリプト

更新日 2022-02-27
広告
ワンライナー、つまり一行でbashのスクリプトを書けると、ちょっとした作業を短時間で行えるようになります。

基本的なこと

ワンライナーとはいえ、基本的にbashのスクリプトと一緒です。以下のポイントを抑えておきましょう。
  • コマンドの出力結果は、パイプ(|)を使うと、次のコマンドに渡すことができる。
  • 別のコマンドを実行する場合は、セミコロン(;)でコマンドを区切る。

定期的に処理を実行

以下の例は、1秒間隔で5回、dateコマンドを実行します。
~$ i=1; while [ $i -le "5" ]; do date; sleep 1; i=$(($i+1)); done
2012年  6月 30日 土曜日 21:17:21 JST
2012年  6月 30日 土曜日 21:17:22 JST
2012年  6月 30日 土曜日 21:17:23 JST
2012年  6月 30日 土曜日 21:17:24 JST
2012年  6月 30日 土曜日 21:17:25 JST
最初に、ループ用の変数iを初期化しています。'do'の後から、whileループ内で実行するコマンドを書きます。今回は、「dateコマンドの実行」「sleepコマンドの実行」「変数iのインクリメント」の3つを実行しています。

ファイルを検索して、各ファイルに処理を実行

検索したファイルに、sedで置換処理をかける例です。最初に find コマンドでファイルを絞り込み、その後に for-in でループして処理します。
~$ files=$(find . -name '*.java'); for file in $files; do sed -i '.bak' -e 's/foo/bar/g' $file; done
grepを使い、さらに絞り込むこともできます。
~$ files=$(find . -name '*.java' | xargs grep 'foo'); for file in $files; do sed -i '.bak' -e 's/foo/bar/g' $file; done
特定のファイルを全部消すには、以下のようにします。
~$ files=$(find . -name '*.java' | xargs grep 'foo'); for file in $files; do rm $file; done
あるディレクトリにあるファイル名の中の「スペース」を、まとめてアンダースコアに変換する例は、以下です。(ファイル群があるディレクトリに移動してから実行してください)。
for file in * ; do echo $file ; mv "${file}" `echo $file | sed -e 's/ /_/g'` ; done
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system