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 の詳細な分析

推薦する

Nginx+FastDFSでイメージサーバーを構築

設置環境セントス環境依存性: yum -y gccをインストールします yum インストール -y ...

ページコンテンツ全体を中央に配置して、高さがコンテンツに合わせて自動的に拡張されるようにする方法

ページコンテンツ全体を中央に配置する方法と、コンテンツに合わせて高さを自動的に拡大縮小する方法。これ...

フロントエンドJavaScript ES6の詳細について

目次1. はじめに1.1 Babel トランスコーダ1.2 ポリフィル2. let と const ...

js は、州、市、地区の 3 段階の選択カスケードを実装します。

この記事では、省、市、地区の3段階選択を実現するためのjsの具体的なコードを紹介します。具体的な内容...

Dockerを使用して外部からアクセス可能なMySQLを構築する詳細な説明

MySQL 8.0をインストールする docker run -p 63306:3306 -e MYS...

IE6のmin-widthとmin-heightと互換性を持たせる簡単な方法

ウェブサイトがワイドスクリーンの場合、ブラウザ ウィンドウを左右にドラッグすると、ウェブサイトの幅が...

CentOS 6.8 での Hadoop 3.1.1 完全分散インストール ガイド (推奨)

上記:このドキュメントは、3 台の仮想マシンが相互に ping を実行できること、ファイアウォールが...

Dockerデータストレージの概要

この記事を読む前に、ボリューム、バインドマウント、tmpfs マウントの基本を理解しておいてください...

HTML テーブルのオーバーフローの解決方法

テーブルが広い場合は、あふれてしまう可能性があります。たとえば、左と右の 2 つの div がありま...

awk でのループの使用

同じコマンドを複数回実行するさまざまな種類のループについて学習しましょう。 awk スクリプトには、...

MySQL 学習ノート: データ エンジン

現在のデータベースでサポートされているエンジンを表示します エンジンを表示 +-----------...

入力のsize属性とmaxlength属性の違い

最近、プロジェクトで input size 属性と maxlength 属性を使用しました。以前は、...

MySQL の general_log ログの知識ポイントの紹介

以下の操作デモンストレーションはすべて MySQL バージョン 5.6.36 に基づいています。仕事...

Vue3.0 ルーティング自動インポート方法の例

1. 前提条件インポートには require.context メソッドを使用します。vite で作成...