Linux
 Computer >> コンピューター >  >> システム >> Linux

Linuxのxargsコマンドを使いこなす!基本から実践的な活用例まで解説

ターミナル作業において、経験豊富なユーザーほど「より賢く、より楽に」仕事をこなす方法を常に探しています。xargsは、2つのコマンドをつなぐ架け橋として機能する便利なコマンドで、片方のコマンドの出力を読み取り、その項目を使ってもう片方のコマンドを実行します。パターン検索やファイルの削除・リネームなど、さまざまなシーンで活躍します。本記事では、xargsコマンドを効果的に活用する方法を詳しく解説します。

xargsとは?

基本的な動作として、xargsは標準入力(STDIN)から情報を受け取り、読み込んだ項目に対して1回または複数回コマンドを実行します。シンプルな例は数多くありますが、まず一つ紹介しましょう。

xargsでDocumentsフォルダに対してlsコマンドを実行するには、以下のコマンドを実行します。

echo "Documents" | xargs ls
Linuxのxargsコマンドを使いこなす!基本から実践的な活用例まで解説

パイプ記号|は、その左側の出力をxargsへの標準入力として渡す役割を果たします。

ご覧のとおり、xargsは問題なくDocumentsフォルダを読み取ることができました。これはxargsコマンドの能力のごく一部にすぎません。

xargsコマンドはさまざまなコマンドライン操作に利用できますが、特にfindコマンドと組み合わせると真価を発揮します。この記事では、xargsfindを組み合わせた実用的な例をいくつか紹介していきます。

複数ファイルに対する一括操作

ディレクトリ内のすべてのテキストファイルに、あるファイル(ここでは「test0.txt」)の内容をコピーしたいとします。通常であれば複数のコマンドを繰り返し実行する必要がありますが、xargsfindを組み合わせれば1コマンドで済みます。ここでは、テキストが入った「test0.txt」があるディレクトリと、空のテキストファイルが10個ある別のディレクトリを用意しました。test0.txtの内容をもう一方のディレクトリ内の全テキストファイルにコピーするには、次のコマンドを実行します。

find ./test-dir1/ -name "*.txt" | xargs -n1 cp test0.txt
Linuxのxargsコマンドを使いこなす!基本から実践的な活用例まで解説

このコマンドを理解するために、2つの部分に分けてみましょう。

最初の部分はfind ./test-dir1/ -name "*.txt"で、「test-dir1」ディレクトリ内のすべての.txtファイルを検索します。任意のディレクトリを指定できます。

2番目の部分xargs -n1 cp test0.txtは、最初のコマンドの出力(見つかったファイル名)を受け取り、それを1つずつcp(コピー)コマンドに渡します。ここで-nオプションが重要になります。このオプションにより、実行ごとに1つの引数だけを使用するようxargsに指示できるのです。

両者を組み合わせると、全体のコマンドは「test0.txt」の内容をディレクトリ内のすべての.txtファイルにコピーします。

Linuxのxargsコマンドを使いこなす!基本から実践的な活用例まで解説

大量の引数を扱う操作

xargsを使う最大のメリットの一つが、膨大な数の引数を処理できる点です。たとえば、大量のファイルを一度に削除しようとすると、rmコマンドが「Argument list too long(引数リストが長すぎます)」というエラーで失敗することがあります。これは、引数リストが長すぎて処理しきれなかったためで、削除対象のフォルダにファイルが大量にある場合によく発生します。

たとえば、75個のPDFファイルがあり、まとめて削除しようとするとエラーが出る状況を考えてみましょう。

Linuxのxargsコマンドを使いこなす!基本から実践的な活用例まで解説

このような場合もxargsを使えば簡単に解決できます。これらのファイルをすべて削除するには、次のコマンドを使用します。

find ./test-dir2/ -type f -name "*.pdf" -print | xargs rm -f
Linuxのxargsコマンドを使いこなす!基本から実践的な活用例まで解説

パターン検索を伴う操作

ソフトウェア開発者やシステム管理者は、コマンドラインでの作業中にパターン検索を行う機会が非常に多くあります。たとえば、開発者であれば特定の変数を扱っているプロジェクトファイルを手早く確認したいことがありますし、システム管理者であれば特定の設定パラメータを使用しているファイルを把握したいこともあるでしょう。こうした場面では、xargsfindgrepと組み合わせると作業が格段に楽になります。

たとえば、「maketecheasier」という文字列を含むすべての「.txt」ファイルを検索するには、次のコマンドを実行します。

find ./ -name "*.txt" | xargs grep "maketecheasier"

筆者の環境でこのコマンドを実行した結果は次のとおりです。

Linuxのxargsコマンドを使いこなす!基本から実践的な活用例まで解説

ファイルのコピー/移動操作

xargsfindコマンドと組み合わせることで、複数のファイルをあるディレクトリから別のディレクトリへコピーしたり移動したりすることもできます。たとえば、10分以上前に更新されたすべてのテキストファイルを現在のディレクトリから上位ディレクトリへ移動するには、次のコマンドを使用します。

find . -name "*.txt" -mmin +10 | xargs -n1 -I '{}' mv '{}' ../

-Iオプションは、xargsに置換文字列を定義するためのオプションです。この文字列は、findコマンドの出力から読み取ったファイル名に置き換えられます。ここでは置換文字列として{}を使っていますが、実際はどんな文字列でも構いません。たとえば「file」を置換文字列として使うことも可能です。

find . -name "*.txt" -mmin 10 | xargs -n1 -I 'file' mv 'file' ./practice

xargsの不要な実行を防ぐ方法

現在のディレクトリにあるすべての.txtファイルの詳細情報を一覧表示したいとします。先ほど説明したように、次のコマンドで簡単に実現できます。

find . -name "*.txt" | xargs ls -l

しかし、ここで一つ問題があります。findコマンドが.txtファイルを1つも見つけられなかった場合でも、xargslsコマンドを実行してしまうのです。以下がその例です。

Linuxのxargsコマンドを使いこなす!基本から実践的な活用例まで解説

ご覧のとおり、ディレクトリには.txtファイルが存在しないにもかかわらず、xargslsコマンドを実行してしまいました。この挙動を変えるには、-rオプションを使用します。このオプションを付けると、入力が空の場合にコマンドの実行をスキップします。

find . -name "*.txt" | xargs -r ls -l

まとめ

本記事では主にxargsfindの組み合わせに焦点を当ててきましたが、xargsは他の多くのコマンドとも組み合わせて使用できます。複雑なコマンドを連携させて実行したい場合、xargsは非常に心強いツールとなるでしょう。

Linuxでのxargsコマンドの使い方についての解説を楽しんでいただけたら、ぜひ「no space left on device」エラーの対処法やUbuntuの高速化ガイドなど、その他のLinux関連記事もチェックしてみてください。

  1. Linuxのssコマンドでネットワーク接続を監視する方法【基本から実践テクニックまで】

    Linuxを使っていると、ネットワークの状態をもっと詳しく知りたい場面に必ず出会います。そうしたニーズに応えられるツールは数多く存在しますが、中には扱いが複雑なものもあります。ssコマンドは多くのLinuxマシンに標準でインストールされているため、その使い方を知っておくと非常に便利です。ssコマンドとは?2文字だけのコマンド名は一見謎めいて見えますが、実際はとてもシンプルです。多くのLinux/Unixコマンドと同じように、コマンド名はその機能を表す略語になっています。「ss」は「Socket Statistics(ソケット統計)」の略です。Socket Statisticsは、従来のnets

  2. Linuxのwatchコマンドの使い方と実用例をわかりやすく解説

    Linuxのwatchコマンドは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるためのツールです。コマンドの出力が時間とともにどう変化するかをリアルタイムで監視したい場合に非常に便利です。この記事では、watchコマンドの基本的な使い方と、覚えておくと役立つ実用的な例を紹介します。 watchコマンドの基本構文 watchコマンドの構文は以下のとおりです。 watch オプション コマンド 各要素の意味は次のとおりです。 オプション: 後述の表から選択したオプションを指定します。watchコマンドのデフォルト動作を変更できます。 コマンド: watchが繰り返し実行