Como usar a pesquisa soundex na pesquisa de arquivos?

4

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

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

    
por alhelal 28.05.2017 / 12:06

1 resposta

2

Esta é uma resposta escrita para minha própria curiosidade. Você provavelmente deve criar algo com base nas sugestões nas respostas para " Existe um comando Unix que procura por strings similares, baseadas principalmente em como elas soam quando faladas? " (o módulo Perl Text::Soundex ) ao invés de usar isso.

O script de shell a seguir e o script sed que o acompanha faz uma pesquisa de nome de arquivo Soundex na árvore de diretórios com raiz no diretório atual, dada uma cadeia 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" "\ == s" | cut -f 2-' "$soundex" {} +

O script calcula o valor soundex para o termo de pesquisa usando o script sed (abaixo). Em seguida, ele usa find para 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 do termo de pesquisa, o caminho completo para esse arquivo será impresso.

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

O script sed ( soundex.sed ):

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

Isso implementa o "American Soundex" conforme descrito na Wikipedia . Ele não modifica o caractere inicial (além de excluí-lo se não for alfabético), e é por isso que eu insiro as strings com tr no shell script.

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

Versão anotada (as "etapas" referem-se às etapas no artigo da Wikipédia acima mencionado):

# 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/^\(.\).*$//
x

# The hold-space now contains only the first character

# STEP 2

y/bfpvBFPVcgjkqsxzCGJKQSXZdtDTlLmnMNrR/111111112222222222222222333344555566/

# STEP 3

s/\([1-6]\)[hwHW]//g
s/\([1-6]\)*//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/^\(....\).*$//
s/^\(...\)$//
s/^\(..\)$/0/
s/^\(.\)$/00/

A pesquisa com valores soundex se resume a sorte.

Além disso:

$ 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
    
por 17.02.2018 / 20:40