プログラムからの出力を取得し、次のコマンドにパイプする行を対話的にフィルタリングしたいと思います。
ls | interactive-filter | xargs rm
たとえば、パターンが一致しないファイルのリストがあり、それを縮小するとします。interactive-filter
ファイル リストの出力をページングし、次のコマンドに転送する行を対話形式で指定できるコマンドが必要です。この場合、各行が削除されます。
答え1
iselect
アップダウン リスト (前のパイプからの入力として) を提供し、ユーザーは複数のエントリをタグ付けできます (次のパイプへの出力として)。# show some available executables ending in '*sh*' to run through `whatis` find /bin /sbin /usr/bin -maxdepth 1 -type f -executable -name '*sh' | iselect -t "select some executables to run 'whatis' on..." -a -m | xargs -d '\n' -r whatis
スペースバーを押してシステム上のいくつかにタグを付けた後の出力:
dash (1) - command interpreter (shell) ssh (1) - OpenSSH SSH client (remote login program) mosh (1) - mobile shell with roaming and intelligent local echo yash (1) - a POSIX-compliant command line shell
vipe
パイプを通過する内容を(好みのテキストエディタで)対話的に編集できます。例:# take a list of executables with long names from `/bin`, edit that # list as needed with `mcedit`, and run `wc` on the output. find /bin -type f | grep '...............' | EDITOR=mcedit vipe | xargs wc
出力(中にいくつかの行を削除した後
mcedit
):378 2505 67608 /bin/ntfs-3g.secaudit 334 2250 105136 /bin/lowntfs-3g 67 952 27152 /bin/nc.traditional 126 877 47544 /bin/systemd-machine-id-setup 905 6584 247440 total
プッシュとプルに関する注意:
iselect
リストから始まり、何もないが選択されます。vipe
リストから始まり、毎表示される項目は、ユーザーが削除しない限り、パイプを介して送信されます。
でデビアンベースのディストリビューションでは、両方のユーティリティを でインストールできますapt-get install moreutils iselect
。
答え2
vipe
シェルで数行記述できます。私の場合は、簡単に概念実証できました。
EDITOR=vi # change to preferred editor as needed.
vipe()
{
cat > .temp.$$
if $EDITOR .temp.$$ < /dev/tty > /dev/tty 2>&1 ; then
cat .temp.$$
fi
rm .temp.$$
}
これをシェルにソースすると、そこに出力されます。の目的は、if
エディター (またはエディターの実行試行) が失敗した場合に出力の生成を抑制することです。