¿Cómo utilizar la búsqueda de Soundex en la búsqueda de archivos?

¿Cómo utilizar la búsqueda de Soundex en la búsqueda de archivos?

Tengo un directorio que contiene numerosos archivos. Además, olvido el nombre exacto del archivo. Entonces, cuando quiero encontrar un archivo no lo encuentro.

Si hay alguna herramienta que utilice el algoritmo Soundex para realizar búsquedas que sea útil para mi caso.

Respuesta1

Esta es una respuesta escrita por mi propia curiosidad. Probablemente deberías construir algo a partir de las sugerencias en las respuestas a "¿Existe un comando de Unix que busque cadenas similares, basándose principalmente en cómo suenan cuando se pronuncian?" (el Text::Soundexmódulo Perl) en lugar de usar esto.


El siguiente script de shell y sedel script que lo acompaña realizan una búsqueda de nombre de archivo Soundex en el árbol de directorios con raíz en el directorio actual dada una cadena de búsqueda en la línea de comando.

$ sh soundex.sh fissbux
./fizzbuzz
./fizzbuzz.c
./fizzbuzz2
./fizzbuzz2.c

$ sh soundex.sh sharlok
./HackerRank/Algorithms/02-Implementation/17-sherlock_and_squares.c

$ sh soundex.sh sundek
./soundex.sh
./soundex.sed

El script de shell ( soundex.sh):

#!/bin/sh

soundex=$( printf '%s\n' "$1" | tr 'a-z' 'A-Z' | sed -f soundex.sed )

find . -exec bash -c '
    paste <( printf "%s\n" "${@##*/}" | tr "a-z" "A-Z" | sed -f soundex.sed ) \
          <( printf "%s\n" "$@" ) |
    awk -vs="$0" "\$1 == s" | cut -f 2-' "$soundex" {} +

El script calcula el valor de soundex para el término de búsqueda utilizando el sedscript (a continuación). Luego findbusca todos los nombres en el directorio actual o debajo y calcula el valor de Soundex para cada uno de la misma manera que para el término de búsqueda. Si un valor de Soundex para un nombre de archivo coincide con el del término de búsqueda, se imprime la ruta completa a ese archivo.

Admito que el script de shell es un poco básico. Por ejemplo, se puede mejorar agregando la ruta absoluta al soundex.sedscript. Tal como está escrito ahora, requiere que el sedscript esté en el directorio actual. Tampoco admite nombres de archivos que contengan nuevas líneas.

La sedsecuencia de comandos ( soundex.sed):

s/[^[:alpha:]]//g
h
s/^\(.\).*$/\1/
x
y/bfpvBFPVcgjkqsxzCGJKQSXZdtDTlLmnMNrR/111111112222222222222222333344555566/
s/\([1-6]\)[hwHW]\1/\1/g
s/\([1-6]\)\1\1*/\1/g
s/[aeiouyhwAEIOUYHW]/!/g
s/^.//
H
x
s/\n//
s/!//g
s/^\(....\).*$/\1/
s/^\(...\)$/\10/
s/^\(..\)$/\100/
s/^\(.\)$/\1000/

Esto implementa "American Soundex"como se describe en Wikipedia. No modifica el carácter inicial (aparte de eliminarlo si no es alfabético), por lo que pongo en mayúsculas las cadenas tren el script de shell.

Esto no se ha probado exhaustivamente, pero parece manejar correctamente los nombres mencionados en el artículo de Wikipedia.

Versión comentada (los "pasos" se refieren a los pasos del artículo de Wikipedia mencionado anteriormente):

# Remove non-alphabetic characters
s/[^[:alpha:]]//g

# STEP 1 (part 1: retain first character)

# Save whole line in hold-space
h

# Delete everything but the first character and swap with hold-space
s/^\(.\).*$/\1/
x

# The hold-space now contains only the first character

# STEP 2

y/bfpvBFPVcgjkqsxzCGJKQSXZdtDTlLmnMNrR/111111112222222222222222333344555566/

# STEP 3

s/\([1-6]\)[hwHW]\1/\1/g
s/\([1-6]\)\1\1*/\1/g

# STEP 1 (part 2: remove vowels etc.)

# We don't actually remove them but "mask" them with "!"
# This avoids accidentally deleting the first character later
s/[aeiouyhwAEIOUYHW]/!/g

# Replace first character with the one saved in the hold-space

# Delete first character
s/^.//

# Append pattern-space to hold-space and swap
H
x

# Remove newline inserted by "H" above and all "!" (old vowels etc.)
s/\n//
s/!//g

# STEP 4

s/^\(....\).*$/\1/
s/^\(...\)$/\10/
s/^\(..\)$/\100/
s/^\(.\)$/\1000/

La búsqueda con valores de Soundex se reduce principalmente a la suerte.


También:

$ paste <( printf '%s\n' * | sed -f soundex.sed ) <( printf '%s\n' * )
F236    Factorio
F230    Fasta
G500    Game
H265    HackerRank
K200    KEYS
L210    Lisp
P625    Parsing
P315    Pathfinder
P315    Pathfinder.tar.xz
Q000    QA
R165    Reformat
R123    Repositories
R564    RimWorld
S613    Scripts
U523    UNIX.dot
U521    UNIX.png
U523    UNIX.txt
W620    Work
a526    answers.txt
c313    cat-food-schedule.txt
f212    fizzbuzz
f212    fizzbuzz.c
f212    fizzbuzz2
f212    fizzbuzz2.c
p363    poetry.txt
q235    questions.txt
r200    rc
s532    soundex.sed
s532    soundex.sh
u313    utp-1.0.tar.gz

información relacionada