Linux で xargs コマンドを使用する詳細なチュートリアル

Linux で xargs コマンドを使用する詳細なチュートリアル

みなさんこんにちは。私は梁旭です。

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

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

Linux や Unix 系オペレーティング システムの優れた機能の 1 つは、1 つのコマンドの標準出力ストリームを別のコマンドの標準入力ストリームにパイプできることです。最初のコマンドは、その出力がターミナル ウィンドウに書き込まれるかどうかを気にしません。また、2 番目のコマンドは、その入力がキーボードから行われるかどうかを気にしません。

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

xargs 、標準データ ストリームを使用して実行パイプラインを構築するコマンドです。 xargsコマンドを使用すると、 echormmkdirなどのコマンドが標準入力を引数として受け入れるようにすることができます。

xargs コマンド

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

ls-1 (1 行に 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経由でファイル名の文字列をtouchコマンドに渡すと、 touchそれらのファイルを作成します。

$ echo '1,2,3' | xargs -p touch 

ターミナルには実行されるコマンドが表示され、 xargs yまたはYnまたはNが入力され、 Enter キーを押して応答するのを待ちます。 Enterのみが押された場合はnとして扱われます。このコマンドは、 yまたはYを入力した場合にのみ実行されます。

yと Enter を押し、 lsを使用してファイルが作成されたかどうかを確認します。

$ 1 2 3 

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

-I (初期引数) オプションを使用して、複数のコマンドでxargsを使用できます。このオプションは替換字符串を定義します。コマンドライン上で置換文字列が現れる場所には、 xargsに指定した値が挿入されます。

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

まず、 treeコマンドを使用して、現在のディレクトリ内のサブディレクトリを表示してみましょう。 -d (ディレクトリ) オプションを指定すると、 treeコマンドはファイルを無視し、ディレクトリのみを出力します。

$ ツリー -d 

現在、サブディレクトリは images のみになります。

directors.txt ファイルには、作成するディレクトリの名前がいくつか含まれています。まずはcatを使って内容を確認してみましょう。

$ cat ディレクトリ.txt 

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

$ cat ディレクトリ.txt | xargs -I % sh -c 'echo %; mkdir %'

このコマンドは次の操作を実行します。

cat directorys.txt : directorys.txt ファイルの内容 (作成するすべてのディレクトリ名) をxargsに渡します。 xargs -I % : 置換文字列%を定義します。 sh -c: 新しいサブシェルを開始します。 -c (common) を指定すると、シェルはコマンドを読み取ります。 'echo %; mkdir %': 各xargsによって渡されたディレクトリ名に置き換えられます。 echoコマンドはディレクトリ名を出力し、 mkdirコマンドはディレクトリを作成します。

コマンド実行結果:

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

$ ツリー -d 

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

xargsコマンドを使用すると、1 つのコマンドでファイルを複数の場所にコピーできます。

まず、 2 つのディレクトリの名前をxargsにパイプします。 xargsは、使用中のコマンドに一度に 1 つの引数のみを渡します。

cp 2 回呼び出し、そのたびに 2 つのディレクトリのいずれかをコマンド ライン引数として指定するには、 xargs-n (最大数) オプションを 1 に設定します。

ここでは、 -v (詳細) オプションも使用して、 cp実行中の処理に関するフィードバックを提供できるようにしています。

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

ファイルを 2 つのディレクトリに 1 つずつコピーしました。 cp詳細な情報を返すので、どのような操作が実行されたかを確認できます。

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

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

ここではfindコマンドを例に挙げます。 findは、ファイル名内のスペースや特殊文字を処理するための独自のオプション、 -print0 (フルネーム、ヌル文字) オプションがあります。

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

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

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

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

ネストされたディレクトリの削除

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

$ ツリー -d 

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

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

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

削除される各ディレクトリの名前が印刷されます。 treeを使用して効果を再度確認できます。

$ ツリー -d 

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

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

findxargsrmを使用すると、すべての種類のファイルを削除し、保持したい種類のファイルのみを保持できます。これには、保持したいファイルの種類を指定する必要があります。

-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 で xargs コマンドを使用する方法についてはこれで終わりです。Linux で xargs コマンドを使用する方法についての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linux trコマンドの使用
  • Linux ipcsコマンドの使用
  • Linux sar コマンドの使用方法とコード例の分析
  • Linux lsコマンドの使用
  • Linux sedコマンドの使用
  • Linuxの読み取りコマンドの使用
  • Linux usermod コマンドの使用
  • Linuxのpasswdコマンドの使用
  • Linuxのtimeコマンドの使い方の詳しい説明
  • Linux lnコマンドの使用
  • Linux telnetコマンドの使用

<<:  Vueユーザーが長時間操作せずにログインページからログアウトするように実装する2つの方法

>>:  MySQL データ型 DECIMAL の詳細な分析

推薦する

MySQLデータベースのトランザクションとインデックスの詳細な説明

目次1. 事務:取引の 4 つの主な特徴:同時トランザクションはどのような問題を引き起こしますか? ...

WeChat アプレット計算機の例

WeChatアプレット計算機の例、参考までに、具体的な内容は次のとおりです。インデックス.wxml ...

Vue マウスホイールスクロール切り替えルーティング効果を実装する方法

ルート ルーティング コンポーネント (アプリの下のルート ルーティング コンポーネント。子コンポー...

MySQL の準同期レプリケーションについての簡単な説明

導入MySQL はレプリケーションを通じてストレージ システムの高可用性を実現します。現在、MySQ...

MySQLの基本操作を詳しく解説(第2部)

序文この記事には1. データベースのいくつかの主要な制約2. テーブル間の関係制約:主キー制約: 機...

MySQLのジョイントクエリについて詳しく説明します

目次ユニオンクエリ1. 中国の各省のIDと名前を照会する2. 湖南省のすべての地級市のIDと名称3....

thead、tfoot、tbodyを使用して表を作成します

これらの 3 つのタグを間違った方法で使用して、タイトルを表に沿わせたり、tbody の高さを固定し...

HTML コメント HTML 内のテキストコメントをマークするための記号

HTML コメント。コードの横に HTML コメントを付ける必要があることがよくあります。そうするこ...

MySQL フルテキスト検索の中国語ソリューションとサンプルコード

MySQL 全文検索中国語ソリューション最近、会社のプロジェクトで、データベースで中国語を検索する機...

Vue.js の watch メソッドと computed メソッドの違いの詳細な例

目次序文導入1. 作用機序2. 自然から3. 時計と計算の比較4. メソッドはデータロジックの関係を...

MySQL トリガーの基本的な使い方(作成、表示、削除など)の詳細な説明

目次1. MySQLトリガーの作成: 1. MySQLトリガー作成構文: 2. MySQL作成構文の...

Linux でバックグラウンドで実行中のプログラムを表示して終了する方法

1. .shファイルを実行する./sh ファイルを使用して直接実行することもできますが、現在のターミ...

TS 数値区切り文字とより厳密なクラス属性チェックの詳細な説明

目次概要演算子の改良と正確なinstanceofよりスマートなオブジェクトリテラル推論固有のシンボル...

Dockerコンテナでアプリケーションサービスを自動的に起動する方法の例

コンテナの起動時に Docker コンテナ内のアプリケーション サービスを自動的に起動する場合。 D...

MySQL Shell import_tableデータインポートの実装

目次1. import_tableの紹介2. データのロードとテーブル関数のインポートの例2.1 L...