Me gustaría tomar el resultado de un programa y filtrar de forma interactiva qué líneas canalizar al siguiente comando.
ls | interactive-filter | xargs rm
Por ejemplo, tengo una lista de archivos con los que un patrón no puede compararse para reducir. Me gustaría un comando interactive-filter
que paginara el resultado de la lista de archivos y pudiera indicar interactivamente qué líneas reenviar al siguiente comando. En este caso, se eliminaría cada línea.
Respuesta1
iselect
proporciona una lista ascendente (como entrada de una tubería anterior), en la que el usuario puede etiquetar varias entradas (como salida a la siguiente tubería):# 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
Resultado después de presionar la barra espaciadora para etiquetar algunos en mi 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 interactivamente (con el editor de texto favorito) lo que pasa por una tubería. Ejemplo:# 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
Salida (después de eliminar algunas líneas mientras está en
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 empujar y tirar:
iselect
comienza con una lista en la quenadaestá seleccionado.vipe
comienza con una lista en la quecadaEl elemento mostrado se enviará a través de la tubería, a menos que el usuario lo elimine.
EnDebianDistribuciones basadas en .ambas utilidades se pueden instalar con apt-get install moreutils iselect
.
Respuesta2
Puedes escribir vipe
en unas pocas líneas de shell. Prueba de concepto rápida y sucia que funciona para mí:
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.$$
}
Introduzca esto en su caparazón y ahí está. El propósito de if
es suprimir la generación de la salida si falla el editor (o el intento de ejecutarlo).