Como usar a pesquisa soundex na pesquisa de arquivos?

Como usar a pesquisa soundex na pesquisa de arquivos?

Eu tenho um diretório que contém vários arquivos. Além disso, esqueci o nome exato do arquivo. Então, quando quero encontrar um arquivo, não o encontro.

Se houver alguma ferramenta que use o algoritmo soundex para pesquisa que seja útil para o meu caso.

Responder1

Esta é uma resposta escrita para minha própria curiosidade. Você provavelmente deveria construir algo a partir das sugestões nas respostas para "Existe um comando Unix que procura strings semelhantes, com base principalmente em como elas soam quando faladas?" (o Text::Soundexmódulo Perl) em vez de usar isso.


O script shell a seguir e sedo script que o acompanha fazem uma pesquisa de nome de arquivo Soundex na árvore de diretórios com raiz no diretório atual, dada uma string de pesquisa na linha 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

O 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" {} +

O script calcula o valor soundex para o termo de pesquisa usando o sedscript (abaixo). Em seguida, ele usa findpara localizar todos os nomes no diretório atual ou abaixo e calcula o valor soundex para cada um da mesma maneira que para o termo de pesquisa. Se um valor soundex para um nome de arquivo corresponder ao termo de pesquisa, o caminho completo para esse arquivo será impresso.

Admito que o shell script é um pouco básico. Por exemplo, pode ser melhorado adicionando o caminho absoluto ao soundex.sedscript. Como está escrito agora, é necessário que o sedscript esteja no diretório atual. Também não suporta nomes de arquivos contendo novas linhas.

O sedroteiro ( 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/

Isso implementa "American Soundex"conforme descrito na Wikipédia. Ele não modifica o caractere inicial (além de excluí-lo se não for alfabético), e é por isso que coloco as strings em maiúsculas trno shell script.

Isso não foi exaustivamente testado, mas parece lidar corretamente com os nomes mencionados no artigo da Wikipedia.

Versão anotada (as "etapas" referem-se às etapas do artigo da Wikipedia mencionado acima):

# 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/

Pesquisar com valores soundex depende principalmente da sorte.


Também:

$ 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

informação relacionada