技術ノート Linux Linux で xargs コマンドを使用する方法

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

重要なポイント

  • xargs は、あるコマンドの出力をパラメータとして別のコマンドに送信できるようにするコマンドで、echo、rm、mkdir などのコマンドが標準入力を引数として受け入れるようにします。
  • xargs を wc などの他のコマンドと併用すると、複数のファイル内の単語、文字、行を簡単にカウントできます。
  • xargs を使用すると、ファイルを複数の場所にコピーしたり、ネストされたディレクトリ内のファイルを削除したり、find コマンドを使用してアーカイブ ファイルを作成したりできます。

いくつかの Linux コマンドを組み合わせる必要がありますが、そのうちの 1 つがパイプ入力を受け入れませんか? xargs そのためのコマンドです。

xargs コマンドを使用する理由

xargs コマンドは、標準データ ストリームを使用して実行パイプラインを構築するために使用されます。つまり、 xargs 使用すると、あるコマンドの出力をパラメータとして別のコマンドに送信できます。

すべての標準 Linux ユーティリティには 、3 つのデータ ストリーム が関連付けられています。それらは、標準入力ストリーム (stdin)、標準出力ストリーム (stdout)、および標準エラー ストリーム (stderr) です。 xargs を使用すると、 echo rm mkdir などのコマンドが標準入力を引数として受け入れることができます。

これらのストリームはテキストを処理します。テキストを使用して入力 (stdin) をコマンドに送信し、応答 (stdout) がテキストとしてターミナル ウィンドウに書き込まれます。エラー メッセージはテキスト (stderr) としてターミナル ウィンドウにも書き込まれます。

Linux および Unix 系オペレーティング システム の優れた機能の 1 つは、1 つのコマンドからの stdout 出力を 2 番目のコマンドの stdin 入力にパイプできる機能です。最初のコマンドは、出力が端末ウィンドウに送信されないことを気にしません。また、2 番目のコマンドは、入力がキーボードから来ていないことを気にしません。

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

ここで xargs が登場します。これまでにいくつかの便利な xargs コマンドの例を取り上げてきましたが、少し読み飛ばしても構いません。これらの例は、必ずしも相互に構築されているわけではありません。

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

xargs コマンド

xargs パイプ入力を受け入れます。ファイルからの入力も受け入れることができます。 xargs 、その入力を、操作するように指示したコマンドのパラメーターとして使用します。 xargs に特定のコマンドを使用するように指示しない場合、デフォルトで echo が使用されます。

これを使用して、 xargs 複数行の入力からでも常に 1 行の出力を生成する方法を実証できます。

ls -1 (1 行に 1 つのファイルをリストする) オプションを使用すると、 filename の単一列 が取得されます。

 ls -1 ./*.sh

これにより、現在のディレクトリにあるシェル スクリプト ファイルが一覧表示されます。

期待どおり、単一の列が得られます。これを xargs にパイプすると何が得られるでしょうか?

 ls -1 ./*.sh | xargs

出力は、1 つの長いテキスト ストリームとして端末ウィンドウに書き込まれます。

この機能により、 xargs パラメータを他のコマンドにフィードできるようになります。

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

wc での xargs の使用

xargs 使用すると、 wc に複数のファイル内の 単語、文字、行を 簡単にカウントさせることができます。

 ls *.page | xargs トイレ

次のようなことが起こります。

  • ls *.page ファイルをリストし、そのリストを xargs に渡します。
  • xargs ファイル名を wc に渡します。
  • wc 、ファイル名をコマンドラインパラメータとして受け取ったかのように扱います。

各ファイルの統計が全体の合計とともに表示されます。

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

確認付きの xargs の使用

-p (対話型) オプションを使用すると、 xargs に続行してよいかどうかの確認を求めるプロンプトを表示できます。

xargs を介してファイル名の文字列を touch に渡すと、 touch ファイルを作成します

エコー「ワンツースリー」 | xargs -p タッチ

実行されるコマンドが表示され、 xargs 「y」または「Y」、または「n」または「N」を入力して Enter を押すことによる応答を待ちます。

そのまま Enter を押すと「n」として扱われます。このコマンドは、「y」または「Y」を入力した場合にのみ実行されます。

「y」を押してEnterを押しました。 ls を使用して、ファイルが作成されたことを確認できます。

 1、2、3 

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

複数のコマンドでの xargs の使用

-I (初期引数) オプションを使用すると、 xargs で複数のコマンドを使用できます。

このオプションは「置換文字列」を定義します。コマンド ラインで replace-string のトークンが出現する場所には常に、 xargs に指定された値が挿入されます。

tree コマンドを使用して、現在のディレクトリからサブディレクトリを見てみましょう。 -d (ディレクトリ) オプションを使用すると、 tree ファイルを無視し、ディレクトリのみを報告します。

ツリー -d

「images」というサブディレクトリが 1 つあります。

「directories.txt」というファイルには、作成したいディレクトリの名前がいくつかあります。 cat 使用してその内容を確認できます。

猫のディレクトリ.txt

これを xargs の入力データとして使用します。これから実行するコマンドは次のとおりです。

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

これは次のように分解されます。

  • cat directoryes.txt |: これにより、directrories.txt ファイルの内容 (すべての新しいディレクトリ名) が xargs にプッシュされます。
  • xargs -I %: これは、トークン「%」を使用して「置換文字列」を定義します。
  • sh -c: これにより、新しいサブシェルが開始されます。 -c (コマンド) は、コマンドラインからコマンドを読み取るようにシェルに指示します。
  • ‘エコー %; mkdir %’: 各 “%” トークンは、 xargs によって渡されるディレクトリ名に置き換えられます。 echo コマンドはディレクトリ名を出力します。 mkdir コマンドはディレクトリを作成します。

ディレクトリは 1 つずつリストされます。

もう一度 tree を使用して、ディレクトリが作成されたことを確認できます。

ツリー -d 

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

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

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

2 つのディレクトリの名前を入力パラメータとして xargs にパイプ処理します。 xargs に対して、これらのパラメータのうち 1 つだけを、それが動作しているコマンドに一度に渡すように指示します。

この場合、コマンドは cp です。そのため、 cp 2 回呼び出し、毎回 2 つのディレクトリのいずれかをコマンドライン パラメータとして指定することになります。これを可能にする xargs パラメータは、 -n (最大数) オプションです。これを 1 つに設定します。

また、 cp -v (verbose) オプションを使用して、何が起こっているかを報告します。

 echo ~/バックアップ/ ~/ドキュメント/ページファイル/ | xargs -n 1 cp -v ./*.page

ファイルは 2 つのディレクトリに 1 つずつコピーされます。 cp 各ファイル コピー アクションを報告するので、それらが行われているのを確認できます。

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

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

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

この例では find 使用します。 find ファイル名の 空白文字や奇妙な文字を処理する ための独自のオプションがあります。 -print0 (フルネーム、ヌル文字) オプションです。

探す 。 -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"

これは次のように分解されます。

  • 探す 。 -name “*.png”: find 現在のディレクトリ “.” から検索します。ファイルである「*.png」と一致する名前を持つオブジェクトの場合 ( type -f )。
  • -print0: 名前はヌル文字で終了し、スペースと奇妙な文字に対応します。
  • xargs -0: xargs はファイル名が NULL で終わるものとみなします。スペースや奇妙な文字は問題を引き起こしません。
  • rm -v -rf “{}”: rm は冗長になり、何が起こっているかを報告します ( -v )。これは再帰的 (-r) で、ネストされたサブディレクトリを調べ、プロンプトを表示せずにファイルを削除します ( -f )。 「{}」は各ファイル名に置き換えられます。

すべてのサブディレクトリが検索され、検索パターンに一致するファイルが削除されます。

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

ネストされたサブディレクトリのセットを削除したいとします。 tree 私たちに見せてくれるでしょう。

ツリー -d

探す 。 -name "level_one" -type d 印刷 | xargs -o rm -v -rf "{}"

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

このコマンドと前のコマンドの唯一の大きな変更点は、検索語が最上位のディレクトリの名前であること、および -type d find ファイルではなくディレクトリを検索するように指示していることです。

各ディレクトリが削除されると、その名前が出力されます。 tree で確認できます:

ツリー -d

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

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

find xargs 、および rm を使用して、保持したい 1 つのタイプを除くすべてのファイルを削除できます。少し直感に反しますが、削除したいファイルの名前ではなく、保持したいファイルタイプの名前を指定します。

-not オプションは、検索パターンに一致しないファイルの名前を返すように find 指示します。 xargs -I (初期引数) オプションをもう一度使用します。今回定義する文字列置換トークンは「{}」です。これは、以前に生成した文字列置換トークン (たまたま「%」) とまったく同じように動作します。

探す 。 -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}

ls で確認できます。ディレクトリに残るファイルは、「*.sh」検索パターンに一致したファイルだけです。

 ls -l

Xargs を使用したアーカイブ ファイルの作成

find 使用してファイルを検索し、それらを xargs 経由で tar に渡し、アーカイブ ファイルを作成できます。

現在のディレクトリ内を検索してみます。検索パターンは「*.page」なので、「.page」ファイルを検索します。

 find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz

アーカイブ ファイルが作成されると、ファイルは期待どおりにリストされます。

データメディエーター

物を積み上げるときに、ちょっとした足場が必要になることがあります。 xargs 、情報を送り出すことができるコマンドと、それを取り込むように構築されていないコマンドとの間のギャップを埋めます。

xargs find 両方とも膨大な数のオプションがあります。詳細については、man ページをチェックすることをお勧めします。

Linuxコマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · パッチ · 変換 · rclone · シュレッド · srm · scp · gzip · chattr · カット · 検索 · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · グループ · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワッド · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

「 Linux で xargs コマンドを使用する方法」に関するベスト動画選定!

Linuxコマンドをこっそり練習する方法㊙
Xargs Should Be In Your Command Line Toolbag