Linux の xargs コマンド:コマンドの構築

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Linux の強力な xargs コマンドを探ります。xargs コマンドは、標準入力からコマンドを構築して実行するための多用途なツールです。引数のリストを処理してコマンドラインに変換する際に特に便利です。

この実験全体を通じて、「本の処理」という概念を例としてタスクを行います。「本の処理」は特定の Linux コマンドではなく、項目のリストに対して行いたい任意の操作のための置き換え文字であることに注意することが重要です。私たちの例では、この処理をシミュレートするために echotouch のような簡単なコマンドを頻繁に使用します。実際のシナリオでは、これらを特定のタスクに関連するより複雑なコマンドやスクリプトに置き換えます。

この実験が終了するまでに、xargs を使用して効率的にファイルを管理し、反復タスクを自動化できるようになります。この実験は初心者向けに設計されているので、Linux コマンドに慣れていなくても心配しないでください。私たちが丁寧に各ステップを案内します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux/BasicSystemCommandsGroup -.-> linux/xargs("Command Building") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") subgraph Lab Skills linux/xargs -.-> lab-219201{{"Linux の xargs コマンド:コマンドの構築"}} linux/cat -.-> lab-219201{{"Linux の xargs コマンド:コマンドの構築"}} end

xargs コマンドの理解

まずは、xargs コマンドの基本的な使い方を理解しましょう。xargs がファイルからの入力とどのように動作するかを示すために、簡単な例を使います。

まず、果物のリストが含まれるファイルの内容を見てみましょう。

cat ~/project/fruits.txt

次の出力が表示されるはずです。

apple
orange
banana

次に、このファイルの内容を xargs を使って echo しましょう。

cat ~/project/fruits.txt | xargs echo

次の出力が表示されるはずです。

apple orange banana

この例では、xargscat からの入力を受け取り、echo コマンドの引数として使います。ここでの echo コマンドは、私たちの「処理」操作をシミュレートしています。デフォルトでは、xargs は各行を個別の引数として扱い、それらを単一のコマンドに結合します。

ここで何が起こっているか分解してみましょう。

  1. cat ~/project/fruits.txt はファイルの内容を読み取ります。
  2. |(パイプ)記号はこの出力を次のコマンドに送ります。
  3. xargs echo は入力から各行を取り、echo コマンドの引数として使います。

これは便利です。なぜなら、これにより単一のコマンドで複数の項目を処理できるからです。これは、各項目を個別に処理するよりもはるかに効率的です。実際のアプリケーションでは、echo を、リスト内の各項目に対して実行する必要のあるコマンドやスクリプトに置き換えます。

xargs を使ったファイル処理

デジタルアーカイブを整理する仕事をする図書館員だとしましょう。本のタイトルのリストがあり、それぞれの本に対して空のファイルを作成する必要があります。この処理を自動化するために xargs を使いましょう。

まず、いくつかの本のタイトルが含まれるファイルの内容を見てみましょう。

cat ~/project/books.txt

次のように表示されるはずです。

The_Great_Gatsby
To_Kill_a_Mockingbird
1984

次に、xargstouch コマンドを使って、それぞれの本に対して空のファイルを作成しましょう。

cat ~/project/books.txt | xargs -I {} touch ~/project/{}.txt

このコマンドを分解してみましょう。

  • cat ~/project/books.txt:これは本のリストファイルの内容を読み取ります。
  • |:このパイプ記号は cat の出力を次のコマンドに送ります。
  • xargs:これは標準入力からコマンドを構築して実行するためのコマンドです。
  • -I {}:このオプションは xargs に対して、コマンド内の {} の出現箇所を各入力行で置き換えるように指示します。
  • touch ~/project/{}.txt:これは xargs が各入力行に対して実行するコマンドです。{} はそれぞれの本のタイトルに置き換えられます。

このコマンドは -I {} オプションを使って、各入力項目のための置換文字 ({}) を指定しています。books.txt の各行に対して、xargs{} を本のタイトルに置き換え、touch コマンドを実行します。

作成されたファイルを確認しましょう。

ls ~/project/*.txt

次のような出力が表示されるはずです。

/home/labex/project/1984.txt
/home/labex/project/The_Great_Gatsby.txt
/home/labex/project/To_Kill_a_Mockingbird.txt
/home/labex/project/books.txt
/home/labex/project/fruits.txt

ご覧の通り、xargs はそれぞれの本のタイトルに対して新しい.txt ファイルを作成しました。元の books.txt と fruits.txt ファイルもあります。

xargs を使った引数の制限

私たちのデジタルライブラリが拡大するにつれて、小さなバッチで本を処理したいと思います。xargs-n オプションを使うと、各コマンド実行に渡される引数の数を制限できます。

もっと多くの本のタイトルが含まれるファイルを見てみましょう。

cat ~/project/more_books.txt

次のように表示されるはずです。

Pride_and_Prejudice
The_Catcher_in_the_Rye
The_Hobbit
Animal_Farm
Brave_New_World

次に、xargs-n オプションを使って、一度に 2 冊の本を処理しましょう。

cat ~/project/more_books.txt | xargs -n 2 echo "Processing books:"

次のような出力が表示されるはずです。

Processing books: Pride_and_Prejudice The_Catcher_in_the_Rye
Processing books: The_Hobbit Animal_Farm
Processing books: Brave_New_World

ここで何が起こっているか分解してみましょう。

  • cat ~/project/more_books.txt:これは本のリストファイルの内容を読み取ります。
  • |:このパイプ記号は cat の出力を次のコマンドに送ります。
  • xargs -n 2:これは xargs に対して、各コマンド実行で最大 2 つの引数を使うように指示します。
  • echo "Processing books:":これは xargs が実行するコマンドで、本のタイトルを追加の引数として持ちます。

このコマンドは、本を 2 つずつ処理します。タイトルの数が奇数の場合、最後の本は単独で処理されます。-n オプションは、特定のグループサイズで項目を処理したい場合に便利です。これは、大きなリストを管理する際や、処理できる引数の数に制限のあるコマンドに役立ちます。

xargs を使った並列処理

私たちのライブラリが拡大し続けるにつれて、ファイル処理の速度を上げたいと思います。xargs-P オプションを使うと、コマンドを並列で実行できます。これは、I/O バウンドの操作に対して性能を大幅に向上させることができます。

まず、本の内容にタイムスタンプを追加することで本の処理をシミュレートするスクリプトを作成しましょう。

cat ~/project/process_book.sh

次のように表示されるはずです。

#!/bin/bash
echo "Processing $1 at $(date)" > ~/project/processed_$1
sleep 2 ## いくらかの処理時間をシミュレートする

このスクリプトは以下のことを行います。

  1. 本のタイトルを引数 ($1) として受け取ります。
  2. 本のタイトルの前に "processed_" を付けた新しいファイルを作成します。
  3. このファイルに、現在の日付と時刻を含むメッセージを書き込みます。
  4. 2 秒間待機して、いくらかの処理時間をシミュレートします。

次に、xargs-P オプションを使って、本を並列で処理しましょう。

cat ~/project/more_books.txt | xargs -P 3 -I {} ~/project/process_book.sh {}

このコマンドを分解してみましょう。

  • cat ~/project/more_books.txt:これは私たちの本のリストを読み取ります。
  • |:このパイプ記号は出力を xargs に送ります。
  • xargs -P 3:これは xargs に対して、最大 3 つのプロセスを並列で実行するように指示します。
  • -I {}:これは各入力項目のための置換文字として {} を定義します。
  • ~/project/process_book.sh {}:これは各本に対して実行するコマンドで、{} は本のタイトルに置き換えられます。

このコマンドは、最大 3 冊の本を同時に処理し始めます。コマンドを実行した後、処理済みファイルの内容を確認できます。

cat ~/project/processed_*

次のような出力が表示されるはずで、並列実行が示されています。正確な時間は異なりますが、以下のようなものが表示されるかもしれません。

Processing Pride_and_Prejudice at Mon Aug 12 10:15:01 UTC 2024
Processing The_Catcher_in_the_Rye at Mon Aug 12 10:15:01 UTC 2024
Processing The_Hobbit at Mon Aug 12 10:15:01 UTC 2024
Processing Animal_Farm at Mon Aug 12 10:15:03 UTC 2024
Processing Brave_New_World at Mon Aug 12 10:15:03 UTC 2024

最初の 3 冊の本が同時に処理を開始し、最後の 2 冊が約 2 秒後に開始することに注目してください(スクリプト内の sleep 2 による)。これが並列処理の実際の様子を示しています。

xargs オプションの組み合わせ

最後のタスクとして、並列処理を活用しながら本をバッチ処理する方法を探ります。-n-I オプションの相互排他性を回避するため、当初の提案とは少し異なるアプローチを使います。

古典文学の本のリストを見てみましょう。

cat ~/project/classic_books.txt

次のように表示されるはずです。

Moby_Dick
War_and_Peace
Ulysses
Don_Quixote
The_Odyssey
Madame_Bovary
Lolita
Hamlet
The_Iliad
Crime_and_Punishment

次に、xargs を使って、最大 3 つの並列プロセスで 2 冊ずつのバッチで本を処理しましょう。

cat ~/project/classic_books.txt | xargs -n 2 -P 3 sh -c 'echo "Processing batch: $0 $1"'

このコマンドを分解してみましょう。

  • cat ~/project/classic_books.txt:これは古典文学の本のリストを読み取ります。
  • |:このパイプ記号は出力を xargs に送ります。
  • xargs:これは標準入力からコマンドを構築して実行するためのコマンドです。
  • -n 2:このオプションは xargs に対して、各コマンド実行で 2 つの引数(本のタイトル)を使うように指示します。
  • -P 3:このオプションは xargs に対して、最大 3 つのプロセスを並列で実行するように指示します。
  • sh -c 'echo "Processing batch: $0 $1"':これは xargs が実行するコマンドです。シェルを使って本のタイトルを表示します。$0$1xargs によって渡される 2 つの本のタイトルを表します。

次のような出力が表示されるはずです。

Processing batch: Moby_Dick War_and_Peace
Processing batch: Ulysses Don_Quixote
Processing batch: The_Odyssey Madame_Bovary
Processing batch: Lolita Hamlet
Processing batch: The_Iliad Crime_and_Punishment

このコマンドは、並列処理を利用しながら大量の項目を効率的にバッチ処理できる方法を示しています。この場合、我々は 2 冊ずつ(-n 2 による)で本を処理し、最大 3 つのこの 2 冊ずつの処理コマンドを並列で実行しています(-P 3 による)。

このアプローチの利点は、全体的な操作を高速化するために並列処理を利用しながら、管理可能なチャンク(この場合は本のペア)で項目を処理できることです。これは、大きなデータセットを扱う場合や、処理速度とシステムリソースの使用をバランスさせる必要がある場合に特に役立ちます。

実際のシナリオでは、echo コマンドをもっと複雑な処理スクリプトに置き換えることができます。たとえば、先ほどの process_book.sh スクリプトを変更して一度に 2 冊の本を処理できるようにし、それを echo コマンドの代わりに使うことができます。

まとめ

この実験では、xargs コマンドを使ってファイル管理タスクを自動化する方法を学びました。基本的な使い方を調べ、ファイルを処理する方法、引数を制限する方法、並列処理を行う方法、および効率的なバッチ処理のためのオプションを組み合わせる方法を学びました。これらのスキルは、Linux 環境で大量のデータを処理する必要がある場合や、繰り返しのタスクを自動化する際に非常に役立ちます。

この実験では扱わなかった追加の xargs オプションをいくつか紹介します。

  • -0:空白ではなく null 文字を区切り文字として使用する
  • -L:各コマンドラインで最大 max-lines の非空白入力行を使用する
  • -s:各コマンドラインで最大 max-chars 文字を使用する
  • -r:標準入力が空の場合はコマンドを実行しない
  • -a:標準入力ではなくファイルから項目を読み取る
  • -E:EOF 文字列を設定する

覚えておいてください。xargs の力は、その柔軟性と他の Linux コマンドとの組み合わせでの動作能力にあります。Linux を使い続けるうちに、xargs がタスクの自動化に役立ち、生産性を向上させるさまざまなシチュエーションに出会うことでしょう。