xargs 配管後パイプコマンド

xargs 配管後パイプコマンド

HP-UX ***** B.11.23 U ia64 ****無制限のユーザーライセンス

find . -type d -name *log* | xargs ls -la

ディレクトリ名(ディレクトリ名に含まれる名前log)とそのディレクトリ内のすべてのファイルを教えてください。

ディレクトリ  /var/opt/SID/application_a/log/などに  /var/opt/SID/application_b/log/は  /var/opt/SID/application_c/log/ログファイルが含まれています。

コマンドで2つの最新のログファイルを一覧表示したいと思います。ls私は通常ls -latr | tail -2

出力は次のようになります。

/var/opt/SID/application_a/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2

find . -type d -name *log* | xargs ls -la | tail -2上記の結果は提供しません。私が得るのは、コマンドの最後の2つのファイルのリストです find . -type d -name *log* | xargs ls -la

それでは、パイピング後にコマンドをパイピングできますかxargs?上記の形式のファイル結果のリストを取得するにはどうすればよいですか?

find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"

現在のディレクトリにある10のディレクトリ名のリストを提供します。これはまさにですが/var/opt/SID、それも私が望むものではありません。

答え1

ほぼすべて来ました。最後のコマンドでは、以下を使用して正しく-I実行できます。ls

-I replace-str

    発生の交換交換-str初期引数では、標準入力から名前を読み込みます。また、引用符のないスペースは項目を終了せず、代わりに区切り文字は改行文字です。意味-xします-L 1

だから、

find . -type d -name "*log*" | xargs -I {} sh -c "echo {}; ls -la {} | tail -2"

echoで見つかったディレクトリを見つけてfindls | tailそのディレクトリで作業を実行します。

答え2

fredtantiniに加えて、一般的な注意事項は次のとおりです(文書が少し混乱しているため)。

標準入力から「{}」文字を取得し、xargs -I {}パイプからの文字に置き換えます。これは、事実上すべて{}の文字の組み合わせを置き換えることができることを意味します(おそらく、好むプログラミングスタイルに適しています)。例えばxargs -I % sh -c "echo %"。常にを使用する場合は略称なので、 に置き換えることxargs -I {}ができます。xargs -i編集する:このxargs -iオプションは廃止予定なので、引き続き使用してくださいxargs -I{}

sh -c標準入力ではなく文字列から次のコマンドを読み取るようにbash /シェルに指示します。したがって、書き込みsh -c "echo something"はと同じですecho something

xargs -I {} sh -c "echo {}"あなたが生成した入力を読みます。これはパイプから得られたパラメータに置き換えるように指示したためです。sh -cecho {}{}

パイプがなくても端末に上記のコマンドを入力すると、簡単にテストできます。次の内容はすべて端末に出力されます(終了するにはCtrl-D)。

ls -la {}コマンドでも同じことが再び発生します。{}パイプライン前のコマンドの内容に置き換えられました。

答え3

GNU Parallelを使用すると、これらの操作が簡単になります。

find . -type d -name "*log*" | parallel --tag "ls -la {} | tail -2"

GNU Parallelを完全にインストールしたくない場合は、最小限のインストールを行うだけです。http://git.savannah.gnu.org/cgit/parallel.git/tree/README

関連情報