Linuxでxargsコマンドを使用する方法

みなさん、こんにちは、Liang Xuです。

Linuxを使用しているときに、いくつかのコマンドを連結する必要があるが、コマンドの1つがパイプ入力を受け付けないという状況に遭遇したことがありますか?この場合、xargsコマンドを使用できますxargs1つのコマンドの出力をパラメーターとして別のコマンドに送信できます。

Linuxでは、すべての標準アプリケーションに3つのデータストリームが関連付けられています。それらは、標準入力ストリーム(stdin)、標準出力ストリーム(stdout)、および標準エラーストリーム(stderr)です。これらのストリームはテキストを介して実行され、入力(stdin)をコマンドに送信するためにテキストを使用し、応答(stdout)がテキストとしてターミナルウィンドウに表示されます。エラーメッセージは、ターミナルウィンドウ(stderr)にもテキスト形式で表示されます。

LinuxおよびUnixのようなオペレーティングシステムの主な機能は、あるコマンドの標準出力ストリームを別のコマンドの標準入力ストリームに渡す機能です。最初のコマンドは、その出力が端末ウィンドウに書き込まれるかどうかを考慮せず、2番目のコマンドは、その入力がキーボードから来るかどうかを考慮しません。

すべてのLinuxコマンドには3つの標準ストリームがありますが、すべてのコマンドが標準入力ストリームへの入力として別のコマンドの標準出力を受け入れるわけではありません。したがって、パイプを介してこれらのコマンドに入力を渡すことはできません。

xargsこれは、標準のデータフローを使用して実行パイプラインを構築するコマンドです。使用してxargsコマンドを我々は作ることができechormそしてmkdirそのコマンドでそのパラメータとして標準入力を受け付けます。

xargsコマンド

xargsパイプライン入力を受け入れる。ファイルからの入力を受け入れることもできます。xargsこの入力を、指定したコマンドのパラメーターとして使用します。xargs特定のコマンドを指定しない場合、デフォルトで使用されますechoxargs入力データが複数行であっても、常に1行の出力を生成します。

(各行にファイルがリストされている)オプションを使用lsすると-1、ファイル名が表示されます。

$ ls -1 ./*.sh

このコマンドは、現在のディレクトリにあるシェルスクリプトファイルを一覧表示します。

出力結果をパイプライン経由で渡すと、xargsどのような効果がありますか?

$ ls -1 ./*.sh | xargs

ご覧のとおり、出力は長いテキスト文字列として端末に書き込まれます。これはxargs、出力をパラメーターとして他のコマンドに渡すことができることを示しています。

wcコマンドでxargsを使用する

xargsコマンドを使用して、コマンドwcが複数のファイルの単語数、文字数、行数を簡単に計算できるようにすることができます

$ ls *.c | xargs wc

実行結果は次のとおりです。

コマンドの実行結果には、統計情報と各ファイルの総数が表示されます。

このコマンドは次のアクションを実行しました:

  • lsすべての.pageファイルがリストされ、リストがに渡されxargsます。
  • xargsすべてのファイル名をに渡しますwc
  • wc これらのファイル名をコマンドラインパラメータとして扱います。

確認メッセージでxargsを使用する

-p(インタラクティブ)オプションを使用してxargsプロンプトを表示できますか?次のステップに進みます。

xargs文字列に渡された場合、filename touchコマンドtouchはこれらのファイルを作成します。

$ echo 'one two three' | xargs -p touch

端末で実行するコマンドを表示しやの入力をxargs待機するyYEnterキーを押して応答します。押すだけの場合は考慮されます。入力またはコマンド実行時のみnNEnternyY

yEnterキーを押してから、を使用lsして、ファイルが作成されたかどうかを確認します。

$ ls one two three

複数のコマンドでxargsを使用する

我々は使用することができます-Iする(初期パラメータ)オプションxargs複数のコマンドを使用することを。このオプションが定義されてい替换字符串ます。コマンドラインのどこにでも置換文字列が表示されxargsます。値を挿入するために提供します。

少し抽象的ですが、例を挙げて説明しましょう。

まずtree、コマンドのサブディレクトリで現在のディレクトリを表示するために使用します。-d(ディレクトリ)オプションができますtreeコマンドは、ファイル、唯一の出力ディレクトリを無視します。

$ tree -d

現在、サブディレクトリイメージは1つだけです。

directory.txtファイルには、作成したいいくつかのディレクトリの名前があります。まずcatコンテンツを表示するために使用します。

$ cat directories.txt

これらのコンテンツを入力データとして渡しxargs、次のコマンドを実行します。

$ cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

このコマンドは次のアクションを実行しました:

  • cat directory.txtdirectory.txtファイルの内容(作成するすべてのディレクトリの名前)をに渡しますxargs
  • xargs -I%:置換文字列が定義されてい%ます。
  • sh -c:新しいサブシェルを開始します。-c(共通)シェルにコマンドを読み取らせます。
  • 'echo%; mkdir%':それぞれxargsディレクトリ名に渡されて置き換えられます。echoディレクトリ名を出力するmkdirコマンド、ディレクトリを作成するコマンド。

コマンド実行結果:

treeディレクトリが作成されたかどうかを確認できます。

$ tree -d

ファイルを複数の場所にコピーする

我々は使用することができますxargs複数の場所にファイルをコピーするコマンドを使用するコマンドを。

まず、2つのディレクトリの名前をパイプで渡しxargsます。そして、xargs使用されているコマンドに渡されたパラメーターの1つだけの時間を測定します。

cp2つのディレクトリの1つをコマンドライン引数として使用して、それぞれ2回呼び出したい場合xargsは、-n1つを実装して(最大数)オプションを設定できます。

また、使用されている-v(詳細)オプションcpにより、フィードバックの操作が実行されます。

$ echo ~/dir1/ ~/dir2/ | xargs -n 1 cp -v ./*.c

ファイルを2つのディレクトリに、一度に1つのディレクトリにコピーしました。cp詳細な情報がフィードバックされ、どのようなアクションが取られたかを確認できました。

ネストされたディレクトリのファイルを削除する

ファイル名にスペースまたはその他の特殊文字(改行など)が含まれている場合、xargsこれらのファイル名は正しく解釈されません。-0(nullターミネーター)オプションを使用して、この問題を解決できます。この場合、最後の区切り文字のファイル名として文字をxargs使用nullします。

ここではfind例としてコマンドを実行します。findファイル名のスペースと特殊文字を処理するための独自のオプションがあります。つまり、-print0(フルネーム、空の文字)オプションです。

$ find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"

このコマンドは、次のアクションを実行します。

  • find。-find name “ * .png”現在のディレクトリから* .pngに一致する名前のオブジェクトtype -fを検索し、ファイルのみを検索するように指定します。
  • -print0:名前はnull文字で終わり、スペースと特殊文字は予約されています。
  • xargs -0xargsファイル名がnull値で終わることも考慮され、スペースや特殊文字は問題を引き起こしません。
  • rm -v -rf "{}"rm進行中の操作をフィードバックし(-v)、操作を再帰的に実行し(-r)、エラーメッセージを送信せずにファイルを直接削除します(-f)。「{}」を各ファイル名に置き換えます。

コマンドの実行後、すべてのサブディレクトリが検索され、一致するファイルが削除されます。

ネストされたディレクトリを削除する

ネストされたサブディレクトリのセットを削除する場合は、まずそれtree使用して表示します。

$ tree -d

$ find . -name "level_one" -type d -print0 | xargs -0 rm -v -rf "{}"

このコマンドは、findを使用して現在のディレクトリを再帰的に検索します。検索対象はlevel_oneという名前のディレクトリであり、そのディレクトリ名がにxargs渡されrmます。

このコマンドと前のコマンドの違いは、検索される項目は最上位のディレクトリの名前で-type dあり、ファイルではなく、検索するディレクトリを指定することです。

削除すると、各ディレクトリの名前が印刷されます。tree効果をもう一度確認できます

$ tree -d

ネストされたすべてのサブディレクトリが削除されました。

1つのファイルタイプを除くすべてのファイルを削除する

を使用してfindすべてのタイプのファイルxargsrm削除し、保持したい1つのタイプのファイルのみを保持できます。これは、保持したいファイルのタイプを提供する必要があります。

-notオプションを使用findすると、ファイル名と一致しないすべての検索パターンを返すことができます。この時点で、再び(初期パラメーター)オプションを使用xargs-Iます。今回定義された置換文字列は{}です。これは、%効果が同じになる前に使用した置換文字列です。

$ find . -type f -not -name "*.sh" -print0 | xargs -0 -I {} rm -v {}

コマンドが実行された後、ls結果を確認するために渡されます。ディレクトリと*.sh一致するファイルのみが表示されます。

$ ls -l

Xargsを使用して圧縮ファイルを作成する

findコマンドを使用して、コマンドにxargs渡されたファイル名でファイルを検索しtar、圧縮ファイルを作成できます。

現在のディレクトリ* .shファイルを検索します。

$ find ./ -name "*.sh" -type f -print0 | xargs -0 tar -cvzf script_files.tar.gz

コマンドの実行結果には、すべての.shファイルがリストされ、圧縮ファイルが作成されます。

最後に、最近、多くの友人からLinuxラーニングロードマップの提供を求められたため、私の経験に基づいて、1か月間余暇を過ごし、電子書籍を作成しました。面接であろうと自己改善であろうと、私はそれがあなたを助けると信じています!ディレクトリは次のとおりです。

みんなに無料でプレゼントして、いいね!

電子ブック| Linux開発ラーニングロードマップ

この電子書籍をより完璧にするために、何人かの友人が私に加わってくれることを願っています。

利得?古いアイアンに3ストライクのコンボを付けて、より多くの人がこの記事を読めるようにしてほしい

推奨読書:

おすすめ

転載: blog.csdn.net/yychuyu/article/details/108209770