GNU/Linux >> Linux の 問題 >  >> Linux

初心者向けのLinuxXargsコマンドの8つの実用例

Linuxのxargs コマンドはあまり人気のないコマンドラインツールかもしれませんが、特に find などの他のコマンドと組み合わせると、非常に便利であるという事実が失われることはありません。 およびgrep 。 xargsを初めて使用し、その使用法を理解したい場合は、それがまさにここで行うことであることを知って喜ぶでしょう。

Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 18.04 LTS (Bionic Beaver). Shell used is Bash, and version is 4.4.19.

1。 Xargsコマンドはどのように機能しますか?

さて、その使用法に飛び込む前に、Xargsが何をするのかを正確に理解することが重要です。素人の言葉で言えば、ツールは、最も基本的な形式で、標準入力(stdin)からデータを読み取り、読み取った入力に基づいてコマンド(引数として提供される)を1回以上実行します。入力内の空白とスペースは区切り文字として扱われ、空白行は無視されます。

xargsの引数としてコマンドが指定されていない場合、ツールが実行するデフォルトのコマンドは echo です。 。たとえば、次の例では、「xargs」を実行し、stdinに「HelloWorld」と入力しました。 Ctrl + Dを押すと(xargsに入力が完了したことを伝えるため)、 echo コマンドが自動的に実行され、「HelloWorld」が再度印刷されました。

2。 xargsを別のコマンドで使用するにはどうすればよいですか?

エコー xargsが実行するデフォルトのコマンドです。他のコマンドを明示的に指定できます。たとえば、findコマンドとその'-name'オプションを引数としてxargsに渡してから、検索するファイルの名前(またはファイルの種類)を渡すことができます。 stdinを介して入力として検索します。

問題の完全なコマンドは次のとおりです。

xargs find -name

たとえば、stdinを介した入力に「* .txt」を指定しました。これは、 findが必要であることを意味します。 現在のディレクトリ(およびそのサブディレクトリ)内のすべての.txtファイルを検索するコマンド。

実行中のコマンドは次のとおりです。

3。 xargsにコマンドを複数回(入力行/引数ごとに1回)実行させる方法

前のセクションで説明した例では、.txtファイルを検索したかったので、入力に「*.txt」を指定しました。しかし、.logや.tmpなど、他の種類のファイルも検索する必要がある場合はどうでしょうか。

これらを「*.txt」の後にxargsへの入力として与えてみて、何が起こるかを確認してください。次のようなエラーが発生するはずです:

これは、xargsがファイル名入力として「*.txt」と「*.log」をfindに渡すためです。 コマンドを実行してから検索 入力に2つのファイル名が含まれているため、失敗します。 findコマンドは次のように実行されていると考えることができます。

find -name "*.txt" "*.log"

そして、それは正しい方法ではありません。

xargsコマンドは、最初に「*.txt」をfindに渡す必要があります。 コマンド、 find .txtファイルに関連する結果が表示され、「*。log」が渡されます。これは、 -Lを使用して実行できます。 コマンドラインオプションxargsが提供します。

-L コマンドラインオプションには、コマンドへの入力として一度に渡される空白以外の行の最大数として扱われる数値が必要です。したがって、この場合、1つの入力行を find への入力として渡す必要があるため、その値は1になります。 一度に。

したがって、実行する必要のあるコマンドは次のとおりです。

xargs -L 1 find -name

次のスクリーンショットは、前述のコマンドの動作を示しています。

ここまでは順調ですね。しかし、次の方法で入力を渡すとどうなりますか:

"*.txt" "*.log"

'-L 1'は、行全体が find に渡されることを確認するため、コマンドは失敗します。 コマンド。

このような状況では、「-n」コマンドラインオプションを使用できます。

'-L'のような'-n'コマンドラインオプションには、xargsがコマンドラインごとに渡す引数の数を表す数値が必要です。この場合、「*。txt」と「* .log」は異なる引数にする必要があります。これらを個別に渡す必要があるため、「-n」の値として「1」を指定する必要があります。 。

xargs -n 1 find -name

したがって、これらはxargsにコマンドを複数回実行させる方法です。

4。 xargsにスペースを含むファイル名を処理させる方法

思い出してください。最初に、xargsは空白スペース(および改行文字)を区切り文字として扱うことを説明しました。これにより、xargsへの入力として渡されるファイル名にスペースが含まれている場合に問題が発生する可能性があります。

たとえば、現在のディレクトリに「new music.mp3」という名前のファイルが含まれていて、xargsがこの名前を mplayerに渡すようにしたとします。 後者がファイルを再生できるようにします。従来の方法で行うと、エラーが発生します:

これは、「new」と「music.mp3」の間にスペースがあるため、これらはmplayerによって2つの異なるファイルとして扱われるためです。この問題を解決する1つの方法は、入力を提供するときに円記号を使用することです。

new\ music.mp3

もう1つの方法は、区切り文字を変更することです。これは、 -dを使用して行うことができます。 オプション。たとえば、xargsに改行のみを区切り文字と見なすように要求できます。これは、次の方法で実行できます。

xargs -d '\n' mplayer

5。 xargsに改行文字を含むファイル名を処理させる方法

これで、xargsに空白を含むファイル名を処理させる方法がわかりました。しかし、改行はどうですか?はい、ファイル名には改行文字を含めることもできます。たとえば、「foo」[newline]「file.txt」という名前のファイルがあります。ターミナルでは、名前は「foo?file.txt」と表示されます。

さて、検索が必要だとします。 コマンドを使用して、名前が「foo」で始まるすべてのファイルを検索し、xargsを使用してこれらのファイルを geditで開きます。 。コマンドは次のとおりです:

find . -name "foo*" | xargs gedit

残念ながら、「foo」という名前の新しいファイルがGeditで開くため、コマンドはその目的を達成できません。これは、改行文字がxargsによって区切り文字として扱われるためと考えられます。

この問題を解決するには、 -print0を使用します オファーを見つけてxargの-0と組み合わせるオプション オプション。 findのmanページでこのオプションを説明する方法は次のとおりです。

 -print0
True; print the full file name on the standard output, followed by a null character (instead of thenewline character that -print uses). This allows file names that contain newlines or other types ofwhite space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.

したがって、使用する必要があるコマンドは次のとおりです。

find . -name "foo*" -print0 | xargs -0 gedit

6。特定のテキストを含むファイルを見つける方法

xargsコマンドは、特定のテキスト/文字列を含むファイルを検索する場合に非常に便利です。たとえば、テキスト「abc」を含む.txtファイルを検索する場合は、次の方法で実行できます。

find -name "*.txt" | xargs grep "abc"

実行中のコマンドは次のとおりです。

非常に明白なように、この場合、xargsコマンドは findから入力を取得します コマンド。

7。 xargsにファイルからの入力を受け入れさせる方法

これまでのところ、xargsがstdin(デフォルトの動作)および別のコマンド(前のセクションで説明)からの入力を受け入れるのを見てきました。ただし、必要に応じて、xargsにファイルからの入力を受け入れさせることもできます。

コマンドの-a オプションを使用すると、これを行うことができます。このオプションはファイル名を想定しています-これはxargsが入力を読み取るファイルになります。

たとえば、「input.txt」という名前のファイルがあるとします。 xargsの入力が含まれています(基本的に、内容はtestfile1.txtとtestfile2.txtの2つのファイル名です)。 xargsを使用してこのファイルから入力を読み取り、それを別のコマンド( ls など)に渡す方法は次のとおりです。 。

xargs -a input.txt ls -lart

実行中のコマンドは次のとおりです。

8。コマンドを実行する前にxargsにユーザー権限を求めさせる方法

xargsにコマンドを複数回実行させる方法についてはすでに説明しました(上記のポイント3を参照)。しかし、コマンドを実行するたびにxargsに許可を求めたい場合はどうでしょうか。これは可能ですか?はい、そうです- -p コマンドラインオプションで可能になります。

インタラクティブモードでxargsを実行する方法の例を次に示します。

xargsコマンドがコマンドラインオプションの形で提供する他の機能がたくさんあるので、ここで表面をかじったところです。このチュートリアルで説明したxargsの概念/機能を試してみてください。疑問や質問がある場合は、manページを参照してください。


Linux
  1. 初心者向けのLinuxcdコマンドチュートリアル(8例)

  2. 初心者向けのLinuxkillallコマンド(8例)

  3. Linux での xargs コマンドの例

  1. Linux初心者向けの10の「rm」コマンド例

  2. 初心者のための10のLinuxCatコマンドの例

  3. 初心者向けのLinux通信コマンドチュートリアル(5例)

  1. 初心者向けのLinuxdirコマンド(10例)

  2. 初心者向けのLinuxrmコマンドの説明(8例)

  3. 初心者向けのLinuxlnコマンドチュートリアル(5つの例)