LoginSignup
1
2

More than 1 year has passed since last update.

Linuxのパイプ、xargsを使おう

Last updated at Posted at 2022-11-03

概要

パイプラインを用いたコマンドとxargsの使い方がよくわからなかったので自分なりにまとめた。

パイプライン

  • パイプcommand1 | command2はcommand1の出力をcommand2の入力として渡す操作。

簡単な例

echo "hello world!" | tee a.txt

これを実行すると、a.txtというファイルにhello world!と書き込まれる。

  • echoは引数をそのまま出力する
  • teeは入力を引数で指定したファイルに書き込む

echoで出力する値"hello, world"がファイル出力のコマンドteeの入力として渡された。

なお上記の操作は以下のコマンドでもほぼ同じ。

echo "hello world!" >> a.txt

xargs

  • command1 | xargs command2でcommand1の出力をcommand2の引数として渡すことができる。

簡単な例

echo b.txt | xargs touch

これを実行すると、b.txtというファイル名のファイルが生成される。

  • echoは引数をそのまま出力する
  • touchは引数で指定された名前のファイルを生成する

便利な使用例

パイプライン|xargsを使うことで色々便利なことができる。

便利操作1. ディレクトリ内のファイルに対してファイル内検索を行う

準備

現在のディレクトリには(先述した操作で)以下のファイルができている。

ls
>> a.txt b.txt

また、a.txt内には"hello, world!"という文字列が入っている。

grep hello a.txt
>> hello, world!

ついでにb.txtには何も文字列は含まれていない。

grep hello b.txt
>> 

lsの結果に対してgrep

この操作をまとめて、「現在のディレクトリに存在するファイルの中を検索」する操作をしてみる。

ls | xargs grep "hello"

以下の出力となる。

a.txt:hello, world!
  • lsで受け取ったファイル名を1個ずつgrepの引数に渡す
  • grepa.txtを受け取った際に一致する文字列を出力する

また、findを用いれば条件に当てはまるファイルのみに対してgrepを適用することができる。

find . -name "*.txt" | xargs grep "hello"
  • find [Path] -name [name]で指定したディレクトリ内でファイルを名前検索できる。今回はa.txt b.txtの二種が該当する。

オマケ

xargsを抜いたらどうなるでしょうか?

ls | grep a

出力は以下のようになる。

a.txt 
  • grep [Pattern] [File]という構文においてFileの部分を省略すると、Fileは入力から受け取る。
  • そこに対してlsの出力であるa.txt b.txtを渡したためその文字列から検索されて指定したパターンaに一致するa.txtがgrepによって抽出された。

便利操作2. 連番を振ったファイルを作る

seq 1 5 | xargs -i touch {}.txt

これを実行すると、1.txt 2.txt 3.txt 4.txt 5.txtと番号が振られたファイルが生成される。

  • seq i jでiからjまでの数を順番に出力する。iを省略したら1からスタートするのでこの場合はseq 5でも同じ。
  • xargs -iとすると、得られた出力値が{}内で受け取ることができる。

ほか

12種類のxargs使用例が掲載されている記事
https://www.tecmint.com/xargs-command-examples/

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2