こんにちは。株式会社フィックスポイントのよしだです。
今回は、勉強会にて xargs
コマンド について取り上げましたので、ご紹介します。
具体的な話の前に、コマンドとは?という話から解説していきますので、あまり身構えずに見てみてください!
コマンドってなに?
非エンジニアからすると、そもそもコマンドとは?と疑問を持ってしまいますよね。
IT用語辞典によると、
ITの分野では、人間からコンピュータへ、あるいは機器間、ソフトウェア間などで交わされる、実行すべき処理の指示や依頼などのことをコマンドということが多い。(中略)
一般的なコマンド文は、何を実行するのかを表すコマンド名に続けて、操作対象や処理内容の詳細を伝える部分(引数、オプション、フラグ、パラメータ)を記述する形式になっていることが多い
と記載されています。
この定義を基に具体例を用いてコマンドを見てみましょう。
下記のようなコマンド例文があったとします。
$ git clone https://github.com/fixpoint/hogehoge
こちらのコマンド文は、下表のように意味ごとに分解することができます。
シンボル | 意味 |
---|---|
$ |
この部分は正確にはコマンドではないが、一般ユーザーで実行しているコマンドを示す意味で使われる事が多い ちなみに # でスーパーユーザー(管理者)という意味 (Linux や Unix の場合) |
git |
コマンド:ここで指定したプログラムが実行される |
clone |
引数 1 つめ:解釈はコマンド(ここでは git )次第 |
https... |
引数 2 つめ:解釈はコマンド(ここでは git )次第 |
今回の例では、 git
というコマンドを使用して、 clone
,
https://github.com/fixpoint/hogehoge
という処理をしようとしていることが分かります。
いろいろなコマンド
コマンドの概要を掴んだところで、本題の xargs
コマンドにも繋がるコマンドをいくつか紹介します。
echo
コマンド
echo
コマンドは、後ろに続く引数をそのまま表示するコマンドです。
例えば、下記のようなコマンド文を入力したとします。
$ echo hoge piyo foo bar
すると、命令されたとおりに、hoge piyo foo bar
と表示されるのです。
実際の画面は以下の通りです。
echo
コマンドについては、当ブログにて詳細に紹介した記事もありますので、興味のある方はぜひ覗いてみてください!
cat
コマンド
cat
コマンドは、ファイルを連結するためのコマンドですが、ファイルの中身を確認する際にも使用します。
例えば、下記のようなコマンド文を打つと、file1
の中になにがあるのかを見ることができます。
cat file1
ただ、今回はこの方法では使わないため、「こういうコマンドがあるんだ」と存在だけご認識いただければと思います。
パイプ
パイプと呼ばれる |
というコマンドによってコマンド同士を繋ぐと、左から流れてきた情報を右に流すことができます。
$ echo hoge piyo foo bar | cat
上記の場合、cat
コマンドはなにもせず、左から右へ情報を受け流します。
そのため、表示される内容はこのようになります。
ls
コマンド
ls
コマンドは、ファイルを一覧表示するコマンドです。
上記のように、 現在のフォルダー の中身である file1,file2,file3
が表示されます。
ではここで、先程紹介したパイプを ls
コマンドと使用してみましょう。
表示のされ方が変わりましたね。
ls
はパイプを使うと、1 行 1 ファイルごとに出力してくれるため、このような表記になります。
rm
コマンド
rm
コマンドは、ファイルを削除するコマンドです。
試しに、file1
を削除してみます。
一覧から file1
が消えているのが分かりますね。
このように、ファイルそのものを削除したい際に使用するコマンドです。
xargs
コマンド
さて、関わるコマンドについて一通り触れられましたので、本題の xargs
コマンドについて説明していきます。
xargs
は、標準入力されたデータを行ごとコマンド引数に加えるコマンドです。
つまりは一体どういうこと?となるかと思いますので、具体的に説明していきます。
まずは、こちらのコマンド文を入力してみます。
$ ls | xargs echo
すると…
「えっ? ls
だけやった時と変わらなくない?」と思われたのではないでしょうか。
たしかにご覧の通り、見た目上に変化はありません。
なぜなら、ls
の処理がそのまま echo
処理されたためです。
もう少し詳しく説明すると、以下のような流れで処理が進んでいます。
ls
により、file1 file2 file3
が出力されます。|
によって情報は右に流れます。xargs
により、流れてきたデータを次のコマンドの引数に入れます。echo
は引数に加えられたfile1 file2 file3
をそのまま表示させます。
そのため、見た目上は全く変わりませんが、別の処理によって表示された文字列だということが分かります。
それではもう一例、xargs
を使って処理を行ってみましょう。
今度は、こちらのコマンドを入力します。
$ ls | xargs rm
先程は、最終的に echo file1 file2 file3
の処理となりましたが、今回は rm file1 file2 file3
となりますね。
つまり、全ファイルが削除されます。怖いですね。
全部削除されてしまったので、ls
をやってもなにも出てきません。
きちんと削除されてしまいました。
-p
オプション
rm
での過ちを予防するには、-p
オプションというものが有効です。
以下のようにコマンド文を入力します。
$ ls | xargs -p rm
すると、下画像のように「本当にこの処理をしてもいいの?」と確認してくれます。
この直後に y
を入力で実行、n
でキャンセルができます。
参加者の反応
今回の発表を聞いた参加者の反応です。
rm
コマンドで全てファイルが消え去った時、大いに盛り上がりを見せていました。笑
エンジニアあるあるなのかもしれません。
最後に
今回は、xargs
コマンドについての勉強会内容を取り上げました。
Linux には、grep
sed
awk
等、行単位で文字を加工するコマンドがたくさんあります。
それらと組み合わせて様々な情報を加工して使うことで、様々な処理が可能になります。
今回の発展編として、実際の業務にて生かされた内容についても紹介予定ですので、ぜひ楽しみにしていてください!
※発展編が公開されました!(2022/02/25)
株式会社フィックスポイントでは、一緒に働いてくれるメンバーを募集しています!
詳細は、こちらをご覧ください。