easytag - Búsqueda de archivos borrosos en la consola de Linux
bash file-search (10)
fd es una alternativa simple, rápida y fácil de usar para encontrar.
Demostración de la página del proyecto GitHub:
¿Alguien sabe una forma de realizar una búsqueda difusa rápida desde la consola de Linux?
Muy a menudo me encuentro en una situación difícil cuando necesito encontrar un archivo en un proyecto, pero no recuerdo el nombre exacto del archivo. En el editor de texto Sublime , presionar Ctrl-P y escribir una parte del nombre, que producirá una lista de los archivos para seleccionar. Esa es una característica increíble con la que estoy bastante feliz. El problema es que en la mayoría de los casos tengo que buscar un código en una consola en máquinas remotas a través de ssh. Entonces, me pregunto si existe una herramienta similar a la función "Ir a cualquier parte" para la consola Linux.
Es probable que valga la pena echarle un vistazo al guión de shell de fasd .
fasd
ofrece acceso rápido a archivos y directorios para shells POSIX. Está inspirado en herramientas como autojump, z y v. Fasd realiza un seguimiento de los archivos y directorios a los que ha accedido, de modo que puede referenciarlos rápidamente en la línea de comando.
Difiere un poco de un hallazgo completo de todos los archivos, ya que solo busca los archivos abiertos recientemente . Sin embargo, sigue siendo muy útil.
La mayoría de estas respuestas no harán búsquedas difusas, como lo hace el texto sublime: pueden coincidir con una parte de la respuesta, pero no hacen el buen comportamiento de "solo encontrar todas las letras en este orden".
Creo que esto está un poco más cerca de lo que quieres. Puse una versión especial de cd (''fcd'') que usa la búsqueda difusa para encontrar el directorio de destino. Súper simple: simplemente agrega esto a tu bashrc:
function joinstr { local IFS="$1"; shift; echo "$*"; }
function fcd { cd $(joinstr /* $(echo "$*" | fold -w1))* }
Esto agregará un * entre cada letra en la entrada, así que si quiero ir, por ejemplo,
/home/dave/results/sample/today
Puedo escribir cualquiera de los siguientes:
fcd /h/d/r/spl/t
fcd /h/d/r/s/t
fcd /h/d/r/sam/t
fcd /h/d/r/s/ty
Usando el primero como ejemplo, esto ejecutará cd /*h*/*d*/*r*/*s*p*l*/*t*
y permitirá que el shell clasifique lo que realmente coincide.
Siempre que el primer carácter sea correcto y se escriba una letra de cada directorio en el camino, encontrará lo que está buscando. Tal vez puede adaptar esto para sus necesidades? El bit importante es:
$(joinstr /* $(echo "$*" | fold -w1))*
que crea la cadena de búsqueda difusa.
No sé qué tan familiarizado estás con la terminal, pero esto podría ayudarte:
find | grep ''report''
find | grep ''report.*2008''
Lo siento si ya conoces grep
y estabas buscando algo más avanzado.
Puede encontrar fzf útil. Es un buscador fuzzy de propósito general escrito en Go que se puede usar con cualquier lista de cosas: archivos, procesos, historial de comandos, ramas de git, etc.
Su script de instalación configurará la combinación de CTRL-T
para su caparazón. El siguiente GIF muestra cómo funciona.
Puede usar encontrar esto para expresiones regex complejas:
find . -type f -regextype posix-extended -iregex ".*YOUR_PARTIAL_NAME.*" -print
O esto para combinaciones más simples tipo glob:
find . -type f -name "*YOUR_PARTIAL_NAME*" -print
O también puedes usar find2perl (que es bastante más rápido y más optimizado que find), así:
find2perl . -type f -name "*YOUR_PARTIAL_NAME*" -print | perl
Si solo quiere ver cómo lo hace Perl, elimine | perl
| perl
parte y verá el código que genera. Es una muy buena forma de aprender por cierto.
Alternativamente, escriba un contenedor de bash rápido como este y llámelo siempre que lo desee:
#! /bin/bash
FIND_BASE="$1"
GLOB_PATTERN="$2"
if [ $# -ne 2 ]; then
echo "Syntax: $(basename $0) <FIND_BASE> <GLOB_PATTERN>"
else
find2perl "$FIND_BASE" -type f -name "*$GLOB_PATTERN*" -print | perl
fi
Nombra esto como qsearch
y luego llámalo así: qsearch . something
qsearch . something
Puedes hacer lo siguiente
grep -iR "text to search for" .
dónde "." siendo el punto de partida, entonces podrías hacer algo como
grep -iR "text to search" /home/
Esto hará que grep busque el texto dado dentro de cada archivo en / home / y los archivos de lista que contengan ese texto.
Usualmente uso:
ls -R | grep -i [whatever I can remember of the file name]
Desde un directorio anterior en el que espero que esté el archivo, cuanto más arriba vaya en el árbol del directorio, más lento será el archivo.
Cuando encuentro el nombre exacto del archivo, lo uso en find:
find . [discovered file name]
Esto podría colapsarse en una línea:
for f in $(ls --color=never -R | grep --color=never -i partialName); do find -name $f; done
(Encontré un problema con ls y grep siendo alias a "--color = auto")
find . -iname ''*foo*''
Búsqueda insensible a mayúsculas y minúsculas de nombres de archivos que contengan foo
.