パイプされたxargsの後のパイプコマンド


38

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/などのログファイルが含まれています。

lsコマンドで最新の2つのログファイルのみを一覧表示したいので、通常はを使用して見つけます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上記の結果は得られません。私が取得するのは、find . -type d -name *log* | xargs ls -laコマンドの最後の2つのファイルのリストです 。

パイプされた後にコマンドをパイプできますxargsか?上記の形式のファイルの結果リストを取得するために、他にどのようにクエリを実行しますか?

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

現在のディレクトリ内にある10個のディレクトリ名のリストが表示されますが/var/opt/SID、これは私が望んでいるものでもありません。


2
引用符で囲む必要があります。*log*そうしないと、シェルがそれを展開します。
アントン

sh -c2番目の引数としてコマンド名(パラメーター0)を想定しているため、常に行う必要があることにfind . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail注意してください(lstail最後に注意してください$0。作成されたシェルの役割を果たします)。そうしないと、最初の結果がその役割を満たし、使用されなくなります。
ジョナス

回答:


58

あなたはほとんどそこにいます。最後のコマンドでは、を使用-Iしてls正しく行うことができます

-I replace-str

    initial-arguments内 のreplace-strの出現を、標準入力から読み取られた名前に置き換えます。また、引用符で囲まれていない空白は入力項目を終了しません。代わりに、区切り文字は改行文字です。-xおよびを意味し-L 1ます。

だから、と

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

echo見つかったディレクトリを検索しfind、それを実行ls | tailします。


見つける。-type d -name " log " | xargs -I {} sh -c "echo {}; ls -ltr {} | grep -E \" file_in | file_out \ "| tail -5"これを使用しました。
-anotherperson1

3
私がやるxargs -n 1 sh -c 'echo $0'
ジンヒン

1
macOSでは、引用符で囲まれたコマンド内で置換は機能しなかったため、echo $0役に立ちました(より理解しやすい)
-mpuncel

1
それは、スペース、使用したファイル名で動作させるために-print0xargs -0エスケープ{}二重引用符の中に内部shコマンド:find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"
ベネディクト・コッペル

「xargs -n 1 sh -c」echo \ $ 0 |を使用します。$ func "` $ func変数を使用する必要がある場合
god


2

fredtantiniに加えて、一般的な説明として(ドキュメントが少し混乱するため):

xargs -I {}標準入力から「{}」の文字を取って、パイプから入って来何でそれらを置き換えます。これは、実際に{}任意の文字の組み合わせに置き換えることができることを意味します(お好みのプログラミングフレーバーをより良くスイートするためかもしれません)。xargs -I % sh -c "echo %"。常にを使用するxargs -I {}場合xargs -iは、短縮形で置き換えることができます。

sh -c文字列からではなく、標準入力から次のコマンドを読むためにあなたのbash /シェルを教えてくれます。したがって、書き込みsh -c "echo something"はと同等echo somethingです。

xargs -I {} sh -c "echo {}"で作成した入力読まれますsh -cされているがecho {}{}パイプから取得した引数に置き換えるように指示したので、それが起こります。

パイピングなしでも簡単にテストできます。ターミナルで上記のコマンドを入力するだけです。次に何を書いても、端末に出力されます(Ctrl-Dで終了)。

ではls -la {}コマンド同じことが再び起こります。{}前パイプコマンドの内容に置き換えられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.