ファイルが存在することを確認したら、ファイル名のリストをxargsに渡す方法は?

ファイルが存在することを確認したら、ファイル名のリストをxargsに渡す方法は?

command1以下のようにファイル名のリストを返すコマンド()があります。

/consumer/a.txt
/consumer/b.txt
/consumer/doesnotexist.txt

出力をパイプするときにcommand1 | xargs command2 command2ファイルのいずれかが存在しないと、例外が発生します。

存在しないファイルをパイピングする前にどのように削除できますかcommand2?次のことを楽しみにしています

command1 | xargs remove_nonexistant_files | xargs command2

command2受けなければならない

/consumer/a.txt
/consumer/b.txt

入力として。

ベストアンサー1

command1 |
xargs sh -c 'for p do [ -f "$p" ] && printf "%s\n" "$p"; done' sh |
xargs command 2

途中の追​​加ビットは、デフォルトで指定されたxargsコマンドライン引数を繰り返し、既存の一般ファイル(または一般ファイルへのシンボリックリンク)に対応するパス名を印刷する短いスクリプトへの別の呼び出しです。これにより、これらの既存のパス名がパイプラインの最後の部分に渡されます。

これは、すべてのパス名に新しい行、スペース、タブが含まれていないと想定します。

おすすめ記事