\r\n\r\n

linuxでのxargsコマンドの使い方

xargsは、あるコマンドの出力を受け取り、それを別のコマンドの引数として送ることができます。

xargsは、あるコマンドの出力を受け取り、それを別のコマンドの引数として送ることができます。

すべての標準的なLinuxユーティリティには、3つのデータストリームが関連付けられています。標準入力ストリーム(stdin)、標準出力ストリーム(stdout)、標準エラーストリーム(stderr)である。

これらのストリームはテキストを扱う。テキストを使ってコマンドに入力を送り(stdin)、その応答(stdout)をテキストとして端末のウィンドウに書き込んでいます。また、エラーメッセージはテキスト(stderr)として端末ウィンドウに書き込まれます。

LinuxやUnix系OSの重要な機能として、あるコマンドの標準出力出力を別のコマンドの標準入力にパイプする機能があります。最初のコマンドは、その出力がターミナルウィンドウに送られなくてもかまわないし、2番目のコマンドは、その入力がキーボードからであってもかまわないのです。

すべてのLinuxコマンドは3つの標準ストリームを持っていますが、すべてのコマンドが他のコマンドの標準出力(stdin)を入力として受け入れるわけではありません。つまり、入力をパイプで送ることはできない。

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

xargsコマンド

xargsはパイプで接続された入力を受け付けます。xargsは、この入力を、処理するように指示したコマンドの引数として使用します。もし、特定のコマンドを使うようにxargsに指示しなければ、デフォルトでechoを使うようになります。

これを利用して、xargsが複数行の入力からであっても、常に1行の出力を生成することを示すことができます。

ls で -1 (1 行に 1 ファイルをリストアップ) オプションを使用した場合、ファイル名の列が表示されます。

ls -1 ./*.sh

カレントディレクトリにあるシェルスクリプトファイルの一覧を表示します。

予想されるカラムが得られた。これをサージェントチューブに通すとどうなるか?

ls -1 ./*.sh | xargs

出力は、長いテキストストリームとしてターミナルウィンドウに書き込まれます。

xargsが他のコマンドに引数を入力できるのは、この機能のためである。

xargs を wc で使用する

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

ls *.page | xargs wc

何が起こったかというと、こうです。

  • ls は *.page ファイルをリストアップし、そのリストを xargs に渡します。
  • xargsはwcにファイル名を渡す。
  • wc はファイル名をコマンドライン引数として扱います。

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

xargsを確認しながら使用する

p (interactive)オプションを使うと、xargsが処理を続行してもよいかどうか確認するプロンプトが表示されます。

xargs経由でtouchにファイル名の文字列を渡すと、touchがファイルを作成してくれます。

echo 'one two three' | xargs -p touch

実行するコマンドが表示されるので、「y」または「y」、または「n」または「n」を入力してxargs"と入力し、Enterキーを押して応答を待ちます。

単にEnterキーを押しただけでは、「n」として扱われ、「y」または「y」が入力されたときのみ実行されます。

ファイルが作成されたかどうかは、lsで確認することができます。

ls one two three

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

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

このオプションは「置換文字列」を定義し、置換文字列のトークンがコマンドライン上に現れるたびに、xargsに供給されます**。

カレントディレクトリのサブディレクトリを表示するために、treeコマンドを使ってみましょう。d (ディレクトリ) オプションを指定すると、ツリーはファイルを無視し、ディレクトリのみを報告するようになります。

tree -d

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

directory.txtというファイルに、作成したいディレクトリの名前を書いておく。その中身をcatで見ることができる。

cat directories.txt

xargsの入力データとして使用します。

cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'

この状況は以下の通りです。

  • catdirectory.txt|: これは directory.txt を押して、ファイル(すべて新しいディレクトリ名)を xargs に入れます。
  • xargs-I%: これは、「置換文字列」とトークン「%」を定義しています。
  • c (コマンド) は、コマンドラインからコマンドを読み込むようにシェルに指示します。
  • echo%; mkdir%': "%" マークは xargs で渡されたディレクトリ名で置き換えられます。

カタログを一枚ずつ掲載しています。

ディレクトリが作成されたことを確認するために、再びtreeを使用することができます。

tree -d

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

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

ここでは、2つのディレクトリの名前を入力パラメータとしてxargsにインポートします。また、使用するコマンドに一度にこれらのパラメータのうち1つだけを渡すようにxargsに指示します。

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

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

echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page

cp はファイルコピー操作の一つ一つを報告してくれるので、その都度確認することができる。

ネストされたディレクトリからファイルを削除する

ファイル名に空白や変な文字(改行など)があると、xargs はそれらを **正確に** 解釈しません。この問題は、-0(ヌルターミネーター)オプションを使用することで克服できる。これは、ファイル名の最後のセパレータとしてヌル文字を使うようにxargsに指示します。

この例では、findを使用します。findは、ファイル名の中のホワイトスペースや奇妙な文字を処理するための独自のオプションを持っています。それは、-print0(フルネーム、ヌル文字)オプションです。

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

この状況は以下の通りです。

  • を見つけることができます。-name "*.png": find は、現在のディレクトリ "." から "*.png" にマッチする名前のオブジェクトを検索します。カレントディレクトリ "." から、"*.png" (type-f) にマッチする名前のファイルを取得します。
  • -print0:The name will end with null character, spaces and strange characters will be satisfied.
  • xargs-0:xargsでは、ファイル名の末尾がNULLであったり、スペースや変な文字があっても問題ないように考慮されます。
  • rm-v-rf "{}": rmは冗長になり、何が起こっているかを報告します(-v)。再帰的 (-r) で、ネストしたサブディレクトリを調べ、プロンプトを出さずにファイルを削除します (-f) 。は各ファイル名に置き換わります。

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

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

例えば、ネストしたサブディレクトリのセットを削除したい場合、ツリーでそれらを確認することができます。

tree -d find . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"

このコマンドは、find を使ってカレントディレクトリを再帰的に検索します。検索対象は "level u one "という名前のディレクトリである。ディレクトリ名は、xargsを介してrmに渡される。

このコマンドと前のコマンドとの唯一の重要な違いは、検索語が最上位のディレクトリの名前であることと、-type dでファイルではなくディレクトリを検索するように指示することです。

ディレクトリを削除すると、ディレクトリ名が表示されます。

tree -d

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

1つのファイルタイプ以外を削除する

find, xargs, rm を使って、残したいタイプのファイル以外を削除することができます。これは少し直感に反しますが、削除したいファイルタイプの名前ではなく、保持したいファイルタイプの名前を提供します。

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

find . -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はどちらも多くのオプションを持っているので、詳細はそれぞれのマニュアルページを確認することをお勧めします。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ