xargs 活用術

こんにちは。株式会社フィックスポイントのよしだです。

今回は、勉強会にて xargsコマンド について取り上げましたので、ご紹介します。

具体的な話の前に、コマンドとは?という話から解説していきますので、あまり身構えずに見てみてください!

コマンドってなに?

非エンジニアからすると、そもそもコマンドとは?と疑問を持ってしまいますよね。

IT用語辞典によると、

ITの分野では、人間からコンピュータへ、あるいは機器間、ソフトウェア間などで交わされる、実行すべき処理の指示や依頼などのことをコマンドということが多い。(中略)
一般的なコマンド文は、何を実行するのかを表すコマンド名に続けて、操作対象や処理内容の詳細を伝える部分(引数、オプション、フラグ、パラメータ)を記述する形式になっていることが多い

と記載されています。

この定義を基に具体例を用いてコマンドを見てみましょう。
下記のようなコマンド例文があったとします。

$ git clone https://github.com/fixpoint/hogehoge

こちらのコマンド文は、下表のように意味ごとに分解することができます。

シンボル 意味
$ この部分は正確にはコマンドではないが、一般ユーザーで実行しているコマンドを示す意味で使われる事が多い
ちなみに # でスーパーユーザー(管理者)という意味 (LinuxUnix の場合)
git コマンド:ここで指定したプログラムが実行される
clone 引数 1 つめ:解釈はコマンド(ここでは git)次第
https... 引数 2 つめ:解釈はコマンド(ここでは git)次第

今回の例では、 git というコマンドを使用して、 clone , https://github.com/fixpoint/hogehoge という処理をしようとしていることが分かります。

f:id:aqui_jasmine:20220204091215p:plain

いろいろなコマンド

コマンドの概要を掴んだところで、本題の xargs コマンドにも繋がるコマンドをいくつか紹介します。

echo コマンド

echo コマンドは、後ろに続く引数をそのまま表示するコマンドです。

例えば、下記のようなコマンド文を入力したとします。

$ echo hoge piyo foo bar

すると、命令されたとおりに、hoge piyo foo bar と表示されるのです。
実際の画面は以下の通りです。

f:id:aqui_jasmine:20220203135240p:plain

echo コマンドについては、当ブログにて詳細に紹介した記事もありますので、興味のある方はぜひ覗いてみてください!

blog.fixpoint.co.jp

cat コマンド

cat コマンドは、ファイルを連結するためのコマンドですが、ファイルの中身を確認する際にも使用します。

例えば、下記のようなコマンド文を打つと、file1 の中になにがあるのかを見ることができます。

cat file1

ただ、今回はこの方法では使わないため、「こういうコマンドがあるんだ」と存在だけご認識いただければと思います。

パイプ

パイプと呼ばれる | というコマンドによってコマンド同士を繋ぐと、左から流れてきた情報を右に流すことができます。

$ echo hoge piyo foo bar | cat

上記の場合、cat コマンドはなにもせず、左から右へ情報を受け流します。

そのため、表示される内容はこのようになります。

f:id:aqui_jasmine:20220204101238p:plain

ls コマンド

ls コマンドは、ファイルを一覧表示するコマンドです。

f:id:aqui_jasmine:20220204122706p:plain

上記のように、 現在のフォルダー の中身である file1,file2,file3 が表示されます。

ではここで、先程紹介したパイプを ls コマンドと使用してみましょう。

f:id:aqui_jasmine:20220204122714p:plain

表示のされ方が変わりましたね。

ls はパイプを使うと、1 行 1 ファイルごとに出力してくれるため、このような表記になります。

rm コマンド

rm コマンドは、ファイルを削除するコマンドです。

試しに、file1 を削除してみます。

f:id:aqui_jasmine:20220204130317p:plain

一覧から file1 が消えているのが分かりますね。
このように、ファイルそのものを削除したい際に使用するコマンドです。

xargs コマンド

さて、関わるコマンドについて一通り触れられましたので、本題の xargs コマンドについて説明していきます。

xargs は、標準入力されたデータを行ごとコマンド引数に加えるコマンドです。

つまりは一体どういうこと?となるかと思いますので、具体的に説明していきます。

まずは、こちらのコマンド文を入力してみます。

$ ls | xargs echo

すると…

f:id:aqui_jasmine:20220204124006p:plain

「えっ? ls だけやった時と変わらなくない?」と思われたのではないでしょうか。

たしかにご覧の通り、見た目上に変化はありません。

なぜなら、ls の処理がそのまま echo 処理されたためです。
もう少し詳しく説明すると、以下のような流れで処理が進んでいます。

  1. ls により、file1 file2 file3 が出力されます。
  2. | によって情報は右に流れます。
  3. xargs により、流れてきたデータを次のコマンドの引数に入れます。
  4. echoは引数に加えられた file1 file2 file3 をそのまま表示させます。

そのため、見た目上は全く変わりませんが、別の処理によって表示された文字列だということが分かります。

f:id:aqui_jasmine:20220204130915p:plain

それではもう一例、xargs を使って処理を行ってみましょう。

今度は、こちらのコマンドを入力します。

$ ls | xargs rm

先程は、最終的に echo file1 file2 file3 の処理となりましたが、今回は rm file1 file2 file3 となりますね。

つまり、全ファイルが削除されます。怖いですね。

f:id:aqui_jasmine:20220204131141p:plain

全部削除されてしまったので、ls をやってもなにも出てきません。
きちんと削除されてしまいました。

-p オプション

rm での過ちを予防するには、-p オプションというものが有効です。

以下のようにコマンド文を入力します。

$ ls | xargs -p rm

すると、下画像のように「本当にこの処理をしてもいいの?」と確認してくれます。

f:id:aqui_jasmine:20220204131814p:plain

この直後に y を入力で実行、n でキャンセルができます。

参加者の反応

今回の発表を聞いた参加者の反応です。

rm コマンドで全てファイルが消え去った時、大いに盛り上がりを見せていました。笑

エンジニアあるあるなのかもしれません。

f:id:aqui_jasmine:20220204134643p:plain

最後に

今回は、xargs コマンドについての勉強会内容を取り上げました。

Linux には、grep sed awk 等、行単位で文字を加工するコマンドがたくさんあります。
それらと組み合わせて様々な情報を加工して使うことで、様々な処理が可能になります。

今回の発展編として、実際の業務にて生かされた内容についても紹介予定ですので、ぜひ楽しみにしていてください!

※発展編が公開されました!(2022/02/25)

blog.fixpoint.co.jp





株式会社フィックスポイントでは、一緒に働いてくれるメンバーを募集しています!

詳細は、こちらをご覧ください。