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::Soundex
módulo Perl) em vez de usar isso.
O script shell a seguir e sed
o 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 sed
script (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 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.sed
script. Como está escrito agora, é necessário que o sed
script esteja no diretório atual. Também não suporta nomes de arquivos contendo novas linhas.
O sed
roteiro ( 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 tr
no 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