みなさん、こんにちは、Liang Xuです。
Linuxを使用しているときに、いくつかのコマンドを連結する必要があるが、コマンドの1つがパイプ入力を受け付けないという状況に遭遇したことがありますか?この場合、xargs
コマンドを使用できます。xargs
1つのコマンドの出力をパラメーターとして別のコマンドに送信できます。
Linuxでは、すべての標準アプリケーションに3つのデータストリームが関連付けられています。それらは、標準入力ストリーム(stdin)、標準出力ストリーム(stdout)、および標準エラーストリーム(stderr)です。これらのストリームはテキストを介して実行され、入力(stdin)をコマンドに送信するためにテキストを使用し、応答(stdout)がテキストとしてターミナルウィンドウに表示されます。エラーメッセージは、ターミナルウィンドウ(stderr)にもテキスト形式で表示されます。
LinuxおよびUnixのようなオペレーティングシステムの主な機能は、あるコマンドの標準出力ストリームを別のコマンドの標準入力ストリームに渡す機能です。最初のコマンドは、その出力が端末ウィンドウに書き込まれるかどうかを考慮せず、2番目のコマンドは、その入力がキーボードから来るかどうかを考慮しません。
すべてのLinuxコマンドには3つの標準ストリームがありますが、すべてのコマンドが標準入力ストリームへの入力として別のコマンドの標準出力を受け入れるわけではありません。したがって、パイプを介してこれらのコマンドに入力を渡すことはできません。
xargs
これは、標準のデータフローを使用して実行パイプラインを構築するコマンドです。使用してxargs
コマンドを我々は作ることができecho
、rm
そしてmkdir
そのコマンドでそのパラメータとして標準入力を受け付けます。
xargsコマンド
xargs
パイプライン入力を受け入れる。ファイルからの入力を受け入れることもできます。xargs
この入力を、指定したコマンドのパラメーターとして使用します。xargs
特定のコマンドを指定しない場合、デフォルトで使用されますecho
。xargs
入力データが複数行であっても、常に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
待機するy
かY
、Enterキーを押して応答します。押すだけの場合は考慮されます。入力時またはコマンド実行時のみ。n
N
Enter
n
y
Y
y
Enterキーを押してから、を使用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.txt:directory.txtファイルの内容(作成するすべてのディレクトリの名前)をに渡します
xargs
。 - xargs -I%:置換文字列が定義されてい
%
ます。 - sh -c:新しいサブシェルを開始します。
-c
(共通)シェルにコマンドを読み取らせます。 - 'echo%; mkdir%':それぞれ
%
がxargs
ディレクトリ名に渡されて置き換えられます。echo
ディレクトリ名を出力するmkdir
コマンド、ディレクトリを作成するコマンド。
コマンド実行結果:
tree
ディレクトリが作成されたかどうかを確認できます。
$ tree -d
ファイルを複数の場所にコピーする
我々は使用することができますxargs
複数の場所にファイルをコピーするコマンドを使用するコマンドを。
まず、2つのディレクトリの名前をパイプで渡しxargs
ます。そして、xargs
使用されているコマンドに渡されたパラメーターの1つだけの時間を測定します。
cp
2つのディレクトリの1つをコマンドライン引数として使用して、それぞれ2回呼び出したい場合xargs
は、-n
1つを実装して(最大数)オプションを設定できます。
また、使用されている-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 -0:
xargs
ファイル名が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
、すべてのタイプのファイルxargs
をrm
削除し、保持したい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か月間余暇を過ごし、電子書籍を作成しました。面接であろうと自己改善であろうと、私はそれがあなたを助けると信じています!ディレクトリは次のとおりです。
みんなに無料でプレゼントして、いいね!
この電子書籍をより完璧にするために、何人かの友人が私に加わってくれることを願っています。
利得?古いアイアンに3ストライクのコンボを付けて、より多くの人がこの記事を読めるようにしてほしい
推奨読書: