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::Soundex
módulo Perl) en lugar de usar esto.
El siguiente script de shell y sed
el 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 sed
script (a continuación). Luego find
busca 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.sed
script. Tal como está escrito ahora, requiere que el sed
script esté en el directorio actual. Tampoco admite nombres de archivos que contengan nuevas líneas.
La sed
secuencia 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 tr
en 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