Gostaria de pegar a saída de um programa e filtrar interativamente quais linhas canalizar para o próximo comando.
ls | interactive-filter | xargs rm
Por exemplo, tenho uma lista de arquivos que um padrão não pode corresponder para reduzir. Gostaria de um comando interactive-filter
que paginasse a saída da lista de arquivos e pudesse indicar interativamente quais linhas encaminhar para o próximo comando. Nesse caso, cada linha seria removida.
Responder1
iselect
fornece uma lista up-down (como entrada de um canal anterior), na qual o usuário pode marcar várias entradas (como saída para o próximo canal):# 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
Saída após pressionar a barra de espaço para marcar alguns no meu sistema:
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
permite editar interativamente (com o editor de texto favorito) o que passa por um tubo. Exemplo:# 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
Saída (depois de excluir algumas linhas enquanto estiver
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
Nota sobre empurrar e puxar:
iselect
começa com uma lista na qualnadaé selecionado.vipe
começa com uma lista na qualtodoo item mostrado será enviado pelo pipe, a menos que o usuário o exclua.
EmDebiandistros baseadas em , ambos os utilitários podem ser instalados com apt-get install moreutils iselect
.
Responder2
Você pode escrever vipe
em algumas linhas de shell. Prova de conceito rápida e suja que funciona para mim:
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.$$
}
Coloque isso em seu shell e aí está. O objetivo if
é suprimir a geração da saída se o editor (ou tentativa de executá-lo) falhar.