[解決済み】linuxのfind -execコマンドにパイプ|を含めるには?
2022-04-01 21:04:06
質問
これはうまくいきません。 これはfindでできるのでしょうか? それともxargsが必要ですか?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
解決方法は?
パイプ記号を複数のプロセスを実行する命令として解釈し、あるプロセスの出力を別のプロセスの入力にパイプする仕事は、シェル(/bin/shまたは同等のもの)が担当します。
この例では、トップレベルのシェルを使って、次のようにパイピングを実行することができます。
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
効率的には、findを1回、zcatを多数回、agrepを1回呼び出すという結果になります。
この場合、zcatの多数の呼び出しによって生成されたすべての出力を処理するagrepプロセスが1つだけ生成されることになります。
何らかの理由でagrepを複数回起動したい場合は、そのようにします。
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
これは、実行するコマンドのリストをパイプを使って構築し、それらを新しいシェルに送信して実際に実行させるものです。 (最後の "| sh" を省略することは、このようなコマンドラインのデバッグやドライランを行うのによい方法です)。
効率という点では、findの1回の起動、shの1回の起動、zcatの多数回の起動、agrepの多数回の起動を要することになります。
コマンドの起動回数の点で最も効率的なのは、Paul Tomblin氏の提案である。
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
...これは、findの1回の呼び出し、xargsの1回の呼び出し、zcatの数回の呼び出し、agrepの1回の呼び出しにかかる費用です。
関連
-
[解決済み】stdinがターミナルでないため、疑似ターミナルが割り当てられない
-
[解決済み】Apacheサーバーがクラッシュし続ける。"caught SIGTERM, shutting down"
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] find .コマンドでディレクトリを除外する方法
-
[解決済み] Linux で grep を使ってファイル名だけを表示するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 "find: paths must priore expression:" カレントディレクトリのファイルも見つける再帰的検索を指定するには?
-
[解決済み】 readChar(con, 5L, useBytes = TRUE) のエラー : 接続を開くことができません。
-
[解決済み】リモートLinuxマシンでC++をコンパイルする - "clock skew detected "の警告が表示される
-
[解決済み】ハイフン(-)で始まるファイル名を処理する方法は?
-
[解決済み] sysrootとは何ですか、そしてどのように作成しますか?
-
[解決済み] bash: cd: そのようなファイルやディレクトリはありません
-
[解決済み] lsコマンドの出力をフィルタリングして、2月に作成されたファイルのみを表示させるにはどうすればよいですか?
-
[解決済み] Bashを使ったファイルの検索とコピー [重複]。
-
[解決済み] Tarエラーです。アーカイブ内の予期しないEOF
-
[解決済み] bashの「#$」はどういう意味ですか?