Pregunta ¿Cómo lograr el tipo de búsqueda AJAX (interactivo) en LINUX para encontrar archivos?


Estoy interesado en escribir una palabra clave de búsqueda en la terminal y poder ver la salida immediately y interactively. Eso significa, como buscar en google, quiero obtener resultados inmediatamente después de cada carácter o palabra ingresada.

Pensé en hacer esto al combinar el comando WATCH y el comando FIND, pero no pude traer los interactivenes.

Supongamos, para buscar un archivo con el nombre 'hint' en nombre de archivo, uso el comando

$ find | grep -i hint

esto más o menos me da los resultados de salida decentes.

Pero lo que quiero es el mismo comportamiento de forma interactiva, es decir, sin volver a escribir el comando, sino solo escribir el SEARCH STRING.

Pensé en escribir un script de shell que lea de un STDIN y ejecute el PIPED-COMMAND anterior por cada 1 segundo. Por lo tanto, lo que escribo toma eso como una instrucción todo el tiempo para el comando. Pero el comando WATCH no es interactivo.

Estoy interesado en el siguiente tipo de SALIDA:

$ hi
./hi
./hindi
./hint

$ hint
./hint

Si alguien puede ayudarme con una alternativa mejor en lugar de mi CÓDIGO PSUEDO, también es bueno


7
2017-07-09 10:35


origen


Respuestas:


Tropezó con esta vieja pregunta, la encontró interesante y pensó que lo probaría. Este script de BASH funcionó para mí:

#!/bin/bash
# Set MINLEN to the minimum number of characters needed to start the    
# search. 
MINLEN=2
clear
echo "Start typing (minimum $MINLEN characters)..." 
# get one character without need for return 
while read -n 1 -s i
do
    # get ascii value of character to detect backspace
    n=`echo -n $i|od -i -An|tr -d " "`
    if (( $n == 127 )) # if character is a backspace...
    then 
        if (( ${#in} > 0 )) # ...and search string is not empty
        then 
            in=${in:0:${#in}-1} # shorten search string by one
            # could use ${in:0:-1} for bash >= 4.2 
        fi
    elif (( $n == 27 )) # if character is an escape...
    then
        exit 0 # ...then quit
    else # if any other char was typed... 
        in=$in$i # add it to the search string
    fi
    clear 
    echo "Search: \""$in"\"" # show search string on top of screen
    if (( ${#in} >= $MINLEN )) # if search string is long enough...
    then    
        find "[email protected]" -iname "*$in*" # ...call find, pass it any parameters given
    fi
done

Espero que esto haga lo que intenta (ed) hacer. Incluí una opción de "inicio de directorio", porque los listados pueden ser bastante difíciles de manejar si buscas en una carpeta de inicio entera o algo así. Solo descarga el $1 si no lo necesitas Usando el valor de ascii en $n debería ser fácilmente posible incluir algunas funciones de tecla de acceso rápido, como salir o guardar resultados.

EDITAR:

Si inicia el script, aparecerá "Comience a escribir ..." y espere a que se presionen las teclas. Si la cadena de búsqueda es lo suficientemente larga (como se define por variable MINLEN) cualquier pulsación de tecla activará un find ejecutar con la cadena de búsqueda actual (el grep parece algo redundante aquí). El script pasa los parámetros dados a find. Esto permite mejores resultados de búsqueda y listas de resultados más cortas. -type d por ejemplo, limitará la búsqueda a directorios, -xdev mantendrá la búsqueda en el sistema de archivos actual, etc. (ver man find) Los retrocesos acortarán la cadena de búsqueda en uno, mientras que al presionar Escape se abandonará el guión. La cadena de búsqueda actual se muestra en la parte superior. solía -iname para que la búsqueda no distinga entre mayúsculas y minúsculas. Cambie esto a `-name 'para obtener un comportamiento sensible a mayúsculas y minúsculas.


2
2017-11-21 12:35



Este código a continuación toma entrada en stdin, un método de filtrado como macro en "$1", y las salidas van a stdout.

Puede usarlo, por ejemplo, de la siguiente manera:

#Produce basic output, dynamically filter it in the terminal,
#and output the final, confirmed results to stdout
vi `find . | terminalFilter`

La macro de filtrado predeterminada es grep -F "$pattern" el script proporciona la variable de patrón como cualquier cosa que se ingrese actualmente. Los resultados inmediatos en función de lo que se ingresa actualmente se muestran en la terminal. Cuando presionas <Enter>, los resultados se vuelven finales y se transmiten a stdout.

#!/usr/bin/env bash

##terminalFilter

del=`printf "\x7f"` #backspace character

input="`cat`"       #create initial set from all input
#take the filter macro from the first argument or use
# 'grep -F "$pattern"'
filter=${1:-'grep -F "$pattern"'}  
pattern=  #what's inputted by the keyboard at any given time

printSelected(){
  echo "$input" | eval "$filter"
}
printScreen(){
  clear
  printSelected
  #Print search pattern at the bottom of the screen
  tput cup $(tput lines);  echo -n "PATTERN: $pattern"
} >/dev/tty   
#^only the confirmed results go `stdout`, this goes to the terminal only

printScreen
#read from the terminal as `cat` has already consumed the `stdin`
exec 0</dev/tty
while IFS=$'\n' read -s -n1 key; do
  case "$key" in 
    "$del") pattern="${pattern%?}";;  #backspace deletes the last character
        "") break;; #enter breaks the loop
         *) pattern="$pattern$key";; #everything else gets appended 
                                     #to the pattern string
  esac
  printScreen
done

clear
printSelected

1
2017-11-24 12:26