web-dev-qa-db-ja.com

`xargs -p`で` yes`を使用する方法は?

_ls | xargs -n1 -p rm_があるとしましょう。yesまたは_yes n_を使用して、_-p_フラグによって生成された質問に自動的に回答するにはどうすればよいですか?

yes n | (ls | xargs -n1 -p rm)を試しましたが、機能しませんでした。

[〜#〜] update [〜#〜]:質問は実際にはrmに関するものではなく、yesを適切に使用する方法に関するものです。 _xargs -p_を使用するエイリアスまたは関数があり、それを実行する前に、それが何をしているかを尋ねて表示するという事実が気に入っています。それが何をするかがわかったら、yesを使用して、関数内のすべての_xargs -p_を自動的に処理できるようにしたいと思います。したがって、この例ではrmを使用していますが、実際にはそれについてではありません。

また、明確にするために、_-p_を使用する、または使用しないようにエイリアスまたは関数を変更したくありません。私はむしろ外部からyesを入力します。

Tbh _yes | some_function_asking_me_questions_やsome_function_asking_me_questions <( yes )のようなものが機能すると思いましたが、機能しませんでした。

2番目の編集:別の例:次のようなリージョンのAWSSNSトピックを一覧表示するエイリアスがあります。

_alias delete_snstopics="list_sns | cut -f 2 | xargs -n1 -p aws sns delete-topic --topic-arn "
_

次に、AWSのリージョンごとに、それらのSNSトピックの削除を検索してプロンプトを表示する関数があります。 SNSトピックのIDは毎回異なり、問題が発生した場合はWebコンソールでSNS IDを照合できるため、xargsが実行される_aws sns delete-topic --topic-arn $1_を確認したいと思います。さらに、特定の地域のSNSトピックを削除したくない場合があります。そのため、この関数でyesを使用して、部分的な削除と完全な削除に同じ関数を使用しても、有用な出力を取得できるようにします。意味がありますか?

3
Gabriel

コマンドを分析してみましょう:

yes n | (ls | xargs -n1 -p rm)

パイプラインls | xargs -n1 -p rmにはlsが標準入力を読み取りますが、標準出力はxargsにリダイレクトされ、標準入力として扱われ、標準出力は変更されません。

ここで、yesの出力をこのパイプラインにパイプします。そのパイプラインの標準入力はlsに入り、それを読み取らないため、xargsはそれを見ることができません。

ここで明らかな質問は次のとおりです。xargsは、コマンドを実行するかどうかをどのように尋ねることができますか?結局のところ、その標準入力(プログラムは通常ユーザーインタラクションを読み取る)は、ls!の出力を読み取るようにリダイレクトされます。

答えは、xargsは、ターミナルファイル/dev/ttyを直接開くだけで、これらの質問のリダイレクトメカニズムをバイパスするということです。したがって、確認入力はファイルリダイレクトの影響を受けません。

xargsに入力するには、プログラムによって制御される端末デバイスでプロセスを提示できるプログラムが必要です。非常に強力な(しかし非常に複雑な)そのようなプログラムはexpectです。残念ながら、私はあなたが望むものを達成するためのより簡単な方法を知りません。

2
celtschk

次を使用できます。

ls | xargs -n1 rm -r

そして、これはディレクトリまたは/およびファイルに対して機能します。

1
VaTo