(おそらく)いくつかの行を印刷してから1行ずつ実行したいコマンドがあります(xargs
使用またはその他など)。
find . -name "*string*" -print | awk '{ print "echo " $1 " >> file.txt" }' | xargs -L 1
各コマンドは、コマンドの追加実行を確認またはキャンセルするためにユーザーが明示的に入力する必要があるプロンプトでecho ... >> file.txt
実行されます。Enter a value:
yes
no
yes
たとえば、これを常に入力するようにラインにパイプすることは可能ですか?または、ユーザーが「はい」と入力するまで一時停止しますか?
これまで、2つの可能な解決策を検討しています。
- 予想されるスクリプトを使用してください。
- 実行されたコマンドラインの標準出力を1行ずつキャプチャし、プロンプトに達するまで行を繰り返してから、ユーザー入力または自動追加または追加を待ち
yes
ますno
。
これを行い、後で追加のコマンドをパイプするより簡単な方法はありますかxargs
? (おそらく私はいつも入りたいですかyes
?)上記の解決策のどれが良いですか?クロスプラットフォームの互換性を確保し、expect
。
答え1
string
名前にその文字列を含むすべてのファイルのパス名をファイルに追加し、各ファイルfile.txt
を解決しようとしています。
実行方法は次のとおりですfind
。
find . -name '*string*' -ok printf '%s\n' {} \; >>file.txt
ユーザーが(または)として応答すると、この-ok
オプションは指定されたユーティリティを実行し、見つかったパス名を挿入します。コマンドは応答が提供されるのを待ちます。{}
y
yes
find
到着いつも返信y
、使用
yes | find ... >>file.txt
(または-ok
に変更-exec
)。
常に返信するには、n
以下を使用してください。
yes n | find ... >>file.txt
元のコマンドが生成するコードにはファイル名がそのまま含まれているため、安全ではありません。したがって、特別に細工されたファイル名を使用してはいけないことを行うコードを生成できます。