xargs
標準入力からリストを読み込んで、逐次コマンドを実行します。 とても便利なコマンドで、ファイルの操作などをCUIで実行するには必須のコマンドだと思います。使いこなせばかなり作業効率が上がると思います。
XARGS(1) BSD General Commands Manual
NAME
xargs -- construct argument list(s) and execute utility
SYNOPSIS
xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]
[-L number] [-n number [-x]] [-P maxprocs] [-s size]
[utility [argument ...]]
github
- githubのjupyter notebook形式のファイルはこちら
google colaboratory
- google colaboratory で実行する場合はこちら
環境
筆者のOSはmacOSです。LinuxやUnixのコマンドとはオプションが異なります。
実際に動かす際は先頭の!や先頭行の%%bashは無視してください。
!sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G95
!bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
使用例
とても便利なコマンド、様々な利用所があります。 以下に私がよく利用するコマンドの例を示します。
lsを利用してファイル名を一括して変更する
ls | grep XXXX | xargs -I{} cp {} {}.bk
XXXXが含まれるファイルを検索し、そのファイルのバックアップを取る。I{}でパイプで渡す前の引数を取得することができます。
%%bash
echo "tempという文字列がつくファイルを3つ作成します。"
echo "temp1" > temp1
echo "temp2" > temp2
echo "temp3" > temp3
ls | grep temp
tempという文字列がつくファイルを3つ作成します。
temp1
temp2
temp3
これら3つのファイルに対してバックアップファイルを作成します。
%%bash
ls | grep temp | xargs -I{} cp {} {}.bk
echo "<file>"
ls | grep temp
<file>
temp1
temp1.bk
temp2
temp2.bk
temp3
temp3.bk
となり、一括でバックアップが作成されます。
特定の文字列を含むファイルを一括削除
abcという文字列を含むファイルをすべて削除します。とても便利です。
%%bash
echo "abcという名前がつくファイルを5つ作成"
echo "abc" > abc1
echo "abc" > abc2
echo "abc" > abc3
echo "abc" > abc4
echo "abc" > abc5
ls | grep abc
abcという名前がつくファイルを5つ作成
abc1
abc2
abc3
abc4
abc5
!ls | grep abc | xargs -I{} rm {}
!ls | grep abc
となり、abcという文字列がつく5つのファイルは削除されました。
ファイルの中にXXXが含まれるファイル名の再帰検索し、すべてYYYに置換
grep XXX -rl . | xargs sed -i.bk -e 's/XXX/YYY/g'
ファイル名にXXXが含まれるファイル名の再帰検索し、すべてYYYに置換
find ./ -type f | sed 'p;s/aaa/bbb/' | xargs -n2 mv
以上のように、とても使い勝手良いコマンドですので、ぜひ自分の用途に応じて使いこなして作業効率を上げていきたいです。
代表的なオプション
xargs -I{}
でパイプ前の結果を引数として取得できるので重宝しています。
- I{}