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

推薦する

Macにmysql5.7.18をインストールする詳細な手順

1. ツール今必要なツールは2つあります: MySQLサーバー (mysql-5.7.18)、MyS...

Uniapp は DingTalk スキャンコード ログイン サンプル コードを実装します

UniappにはDingTalk認証ログインがないため、この記事ではDingTalk QRコードログ...

Docker で nginx の https を設定する方法

https をサポートしていない Web サイトは、ブラウザによって徐々に安全でないとマークされるた...

PHP環境構築におけるDockerの柔軟な実装

Docker を使用して、柔軟なオンライン PHP 環境を構築します。場合によっては、他の人がすでに...

MySQL データベースのインデックスとトランザクション

目次1. 索引1.1 コンセプト1.2 機能1.3 索引作成の原則1.3.1 ディスクアクセス回数を...

フォームから Vue ElementUI を使用してログイン効果を実装する例

目次1. ElementUIで基本的なスタイルを構築する2. [送信]ボタンをクリックして、アカウン...

CSS で 3D ルービック キューブを実装するサンプル コード

今日は簡単な3Dルービックキューブを作ってみましょうまずはレンダリングを見てみましょう!これを学んだ...

単一テーブルのMySQLバックアップとリストアに関する簡単な説明

A. MySQLバックアップツールxtrabackupのインストール1. Percona 公式 xt...

よくある Linux 英語エラーの中国語翻訳 (初心者必見)

1.コマンドが見つかりません コマンドが見つかりません2. そのようなファイルまたはディレクトリは...

CSS と HTML とフロントエンド テクノロジーのレイヤー図

JavascriptとDOMの関係は非常に曖昧で、CSSやHTMLのフロントエンド技術層も理解してい...

Chrome Dev Tools を使用してページのパフォーマンスを分析する方法 (フロントエンドのパフォーマンス最適化)

背景開発やデバッグには Chrome Dev Tools がよく使用されますが、ページのパフォーマン...

モバイルデバイスにおける適応レイアウトの問題に関する簡単な説明 (レスポンシブ、rem/em、Js ダイナミクス)

3G の普及により、携帯電話を使ってインターネットにアクセスする人が増えています。モバイル デバイ...

カーソル ループを使用して、MySQL ストアド プロシージャで一時テーブルを読み取る

カーソルカーソルは、結果セット内のデータを表示または処理するために使用される方法です。カーソルを使用...

VMwareのCentosシステムでNavicatがMySQLサーバーに接続できない問題を解決します

ホスト 'xxxx' はこの MySQL サーバーに接続できませんエラー: 1130...

Tomcat は親の委任メカニズムを破壊して Web アプリケーションの分離を実現します。

目次Tomcat クラスローダー階層WebAppクラスローダー共有クラスローダーカタリナクラスローダ...