重要なポイント
- xargs は、あるコマンドの出力をパラメータとして別のコマンドに送信できるようにするコマンドで、echo、rm、mkdir などのコマンドが標準入力を引数として受け入れるようにします。
- xargs を wc などの他のコマンドと併用すると、複数のファイル内の単語、文字、行を簡単にカウントできます。
- xargs を使用すると、ファイルを複数の場所にコピーしたり、ネストされたディレクトリ内のファイルを削除したり、find コマンドを使用してアーカイブ ファイルを作成したりできます。
いくつかの Linux コマンドを組み合わせる必要がありますが、そのうちの 1 つがパイプ入力を受け入れませんか?
xargs
そのためのコマンドです。
xargs コマンドを使用する理由
xargs
コマンドは、標準データ ストリームを使用して実行パイプラインを構築するために使用されます。つまり、
xargs
使用すると、あるコマンドの出力をパラメータとして別のコマンドに送信できます。
すべての標準 Linux ユーティリティには
、3 つのデータ ストリーム
が関連付けられています。それらは、標準入力ストリーム (stdin)、標準出力ストリーム (stdout)、および標準エラー ストリーム (stderr) です。
xargs
を使用すると、
echo
、
rm
、
mkdir
などのコマンドが標準入力を引数として受け入れることができます。
これらのストリームはテキストを処理します。テキストを使用して入力 (stdin) をコマンドに送信し、応答 (stdout) がテキストとしてターミナル ウィンドウに書き込まれます。エラー メッセージはテキスト (stderr) としてターミナル ウィンドウにも書き込まれます。
Linux および Unix 系オペレーティング システム の優れた機能の 1 つは、1 つのコマンドからの stdout 出力を 2 番目のコマンドの stdin 入力にパイプできる機能です。最初のコマンドは、出力が端末ウィンドウに送信されないことを気にしません。また、2 番目のコマンドは、入力がキーボードから来ていないことを気にしません。
すべての Linux コマンドには 3 つの標準ストリームがありますが、そのすべてが別のコマンドの stdout を stdin への入力として受け入れるわけではありません。つまり、入力をパイプで渡すことはできません。
ここで xargs が登場します。これまでにいくつかの便利な xargs コマンドの例を取り上げてきましたが、少し読み飛ばしても構いません。これらの例は、必ずしも相互に構築されているわけではありません。
xargs コマンド
xargs
パイプ入力を受け入れます。ファイルからの入力も受け入れることができます。
xargs
、その入力を、操作するように指示したコマンドのパラメーターとして使用します。
xargs
に特定のコマンドを使用するように指示しない場合、デフォルトで
echo
が使用されます。
これを使用して、
xargs
複数行の入力からでも常に 1 行の出力を生成する方法を実証できます。
ls
で
-1
(1 行に 1 つのファイルをリストする) オプションを使用すると、
filename の単一列
が取得されます。
ls -1 ./*.sh
これにより、現在のディレクトリにあるシェル スクリプト ファイルが一覧表示されます。
期待どおり、単一の列が得られます。これを
xargs
にパイプすると何が得られるでしょうか?
ls -1 ./*.sh | xargs
出力は、1 つの長いテキスト ストリームとして端末ウィンドウに書き込まれます。
この機能により、
xargs
パラメータを他のコマンドにフィードできるようになります。
wc での xargs の使用
xargs
使用すると、
wc
に複数のファイル内の
単語、文字、行を
簡単にカウントさせることができます。
ls *.page | xargs トイレ
次のようなことが起こります。
-
ls*.page ファイルをリストし、そのリストをxargsに渡します。 -
xargsファイル名をwcに渡します。 -
wc、ファイル名をコマンドラインパラメータとして受け取ったかのように扱います。
各ファイルの統計が全体の合計とともに表示されます。
確認付きの xargs の使用
-p
(対話型) オプションを使用すると、
xargs
に続行してよいかどうかの確認を求めるプロンプトを表示できます。
xargs
を介してファイル名の文字列を
touch
に渡すと、
touch
ファイルを作成します
。
エコー「ワンツースリー」 | xargs -p タッチ
実行されるコマンドが表示され、
xargs
「y」または「Y」、または「n」または「N」を入力して Enter を押すことによる応答を待ちます。
そのまま Enter を押すと「n」として扱われます。このコマンドは、「y」または「Y」を入力した場合にのみ実行されます。
「y」を押してEnterを押しました。
ls
を使用して、ファイルが作成されたことを確認できます。
1、2、3
複数のコマンドでの xargs の使用
-I
(初期引数) オプションを使用すると、
xargs
で複数のコマンドを使用できます。
このオプションは「置換文字列」を定義します。コマンド ラインで replace-string のトークンが出現する場所には常に、
xargs
に指定された値が挿入されます。
tree
コマンドを使用して、現在のディレクトリからサブディレクトリを見てみましょう。
-d
(ディレクトリ) オプションを使用すると、
tree
ファイルを無視し、ディレクトリのみを報告します。
ツリー -d
「images」というサブディレクトリが 1 つあります。
「directories.txt」というファイルには、作成したいディレクトリの名前がいくつかあります。
cat
使用してその内容を確認できます。
猫のディレクトリ.txt
これを
xargs
の入力データとして使用します。これから実行するコマンドは次のとおりです。
猫のディレクトリ.txt | xargs -I % sh -c 'echo %; mkdir %'
これは次のように分解されます。
-
cat directoryes.txt |: これにより、directrories.txt ファイルの内容 (すべての新しいディレクトリ名) が
xargsにプッシュされます。 - xargs -I %: これは、トークン「%」を使用して「置換文字列」を定義します。
-
sh -c: これにより、新しいサブシェルが開始されます。
-c(コマンド) は、コマンドラインからコマンドを読み取るようにシェルに指示します。 -
‘エコー %; mkdir %’: 各 “%” トークンは、
xargsによって渡されるディレクトリ名に置き換えられます。echoコマンドはディレクトリ名を出力します。mkdirコマンドはディレクトリを作成します。
ディレクトリは 1 つずつリストされます。
もう一度
tree
を使用して、ディレクトリが作成されたことを確認できます。
ツリー -d
ファイルを複数の場所にコピーする
xargs
を使用すると、1 つのコマンドでファイルを複数の場所にコピーできます。
2 つのディレクトリの名前を入力パラメータとして
xargs
にパイプ処理します。
xargs
に対して、これらのパラメータのうち 1 つだけを、それが動作しているコマンドに一度に渡すように指示します。
この場合、コマンドは
cp
です。そのため、
cp
2 回呼び出し、毎回 2 つのディレクトリのいずれかをコマンドライン パラメータとして指定することになります。これを可能にする
xargs
パラメータは、
-n
(最大数) オプションです。これを 1 つに設定します。
また、
cp
で
-v
(verbose) オプションを使用して、何が起こっているかを報告します。
echo ~/バックアップ/ ~/ドキュメント/ページファイル/ | xargs -n 1 cp -v ./*.page
ファイルは 2 つのディレクトリに 1 つずつコピーされます。
cp
各ファイル コピー アクションを報告するので、それらが行われているのを確認できます。
ネストされたディレクトリ内のファイルの削除
ファイル名にスペースや改行文字などの奇妙な文字が含まれている場合、
xargs
それらを正しく解釈できません。 -0 (ヌル終端文字) オプションを使用することで、この問題を解決できます。これは、ファイル名の最後の区切り文字としてヌル文字を使用するように
xargs
に指示します。
この例では
find
使用します。
find
ファイル名の
空白文字や奇妙な文字を処理する
ための独自のオプションがあります。
-print0
(フルネーム、ヌル文字) オプションです。
探す 。 -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"
これは次のように分解されます。
-
探す 。 -name “*.png”:
find現在のディレクトリ “.” から検索します。ファイルである「*.png」と一致する名前を持つオブジェクトの場合 (type -f)。 - -print0: 名前はヌル文字で終了し、スペースと奇妙な文字に対応します。
- xargs -0: xargs はファイル名が NULL で終わるものとみなします。スペースや奇妙な文字は問題を引き起こしません。
-
rm -v -rf “{}”: rm は冗長になり、何が起こっているかを報告します (
-v)。これは再帰的 (-r) で、ネストされたサブディレクトリを調べ、プロンプトを表示せずにファイルを削除します (-f)。 「{}」は各ファイル名に置き換えられます。
すべてのサブディレクトリが検索され、検索パターンに一致するファイルが削除されます。
ネストされたディレクトリの削除
ネストされたサブディレクトリのセットを削除したいとします。
tree
私たちに見せてくれるでしょう。
ツリー -d
探す 。 -name "level_one" -type d 印刷 | xargs -o rm -v -rf "{}"
このコマンドは、find を使用して現在のディレクトリ内を再帰的に検索します。検索対象は「level_one」というディレクトリです。ディレクトリ名は
xargs
を通じて
rm
に渡されます。
このコマンドと前のコマンドの唯一の大きな変更点は、検索語が最上位のディレクトリの名前であること、および
-type d
find
ファイルではなくディレクトリを検索するように指示していることです。
各ディレクトリが削除されると、その名前が出力されます。
tree
で確認できます:
ツリー -d
ネストされたサブディレクトリはすべて削除されます。
1 つのファイル タイプを除くすべてのファイルを削除する
find
、
xargs
、および
rm
を使用して、保持したい 1 つのタイプを除くすべてのファイルを削除できます。少し直感に反しますが、削除したいファイルの名前ではなく、保持したいファイルタイプの名前を指定します。
-not
オプションは、検索パターンに一致しないファイルの名前を返すように
find
指示します。
xargs
で
-I
(初期引数) オプションをもう一度使用します。今回定義する文字列置換トークンは「{}」です。これは、以前に生成した文字列置換トークン (たまたま「%」) とまったく同じように動作します。
探す 。 -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}
ls
で確認できます。ディレクトリに残るファイルは、「*.sh」検索パターンに一致したファイルだけです。
ls -l
Xargs を使用したアーカイブ ファイルの作成
find
使用してファイルを検索し、それらを
xargs
経由で
tar
に渡し、アーカイブ ファイルを作成できます。
現在のディレクトリ内を検索してみます。検索パターンは「*.page」なので、「.page」ファイルを検索します。
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz
アーカイブ ファイルが作成されると、ファイルは期待どおりにリストされます。
データメディエーター
物を積み上げるときに、ちょっとした足場が必要になることがあります。
xargs
、情報を送り出すことができるコマンドと、それを取り込むように構築されていないコマンドとの間のギャップを埋めます。
xargs
と
find
両方とも膨大な数のオプションがあります。詳細については、man ページをチェックすることをお勧めします。





