Wie verwende ich die Soundex-Suche bei der Dateisuche?

Wie verwende ich die Soundex-Suche bei der Dateisuche?

Ich habe ein Verzeichnis, das zahlreiche Dateien enthält. Außerdem vergesse ich den genauen Dateinamen. Wenn ich also eine Datei suchen möchte, finde ich sie nicht.

Wenn es ein Tool gibt, das den Soundex-Algorithmus zur Suche verwendet, wäre das für meinen Fall hilfreich.

Antwort1

Dies ist eine Antwort, die ich aus Neugier geschrieben habe. Sie sollten wahrscheinlich etwas aus den Vorschlägen in den Antworten auf "Gibt es einen Unix-Befehl, der nach ähnlichen Zeichenfolgen sucht, hauptsächlich basierend auf ihrer Aussprache?" (das Perl- Text::SoundexModul), anstatt dies zu verwenden.


Das folgende Shell-Skript und das zugehörige sedSkript führen eine Soundex-Dateinamensuche im Verzeichnisbaum mit der Wurzel im aktuellen Verzeichnis durch, wobei in der Befehlszeile eine Suchzeichenfolge angegeben wird.

$ 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

Das Shell-Skript ( 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" {} +

Das Skript berechnet den Soundex-Wert für den Suchbegriff mithilfe des sedSkripts (unten). Anschließend sucht es findnach allen Namen im aktuellen Verzeichnis oder darunter und berechnet den Soundex-Wert für jeden auf die gleiche Weise wie für den Suchbegriff. Wenn ein Soundex-Wert für einen Dateinamen mit dem des Suchbegriffs übereinstimmt, wird der vollständige Pfad zu dieser Datei ausgegeben.

Ich gebe zu, dass das Shell-Skript ein wenig einfach ist. Es könnte beispielsweise verbessert werden, indem man dem soundex.sedSkript den absoluten Pfad hinzufügt. In seiner jetzigen Form erfordert es, dass sich das sedSkript im aktuellen Verzeichnis befindet. Es unterstützt auch keine Dateinamen, die Zeilenumbrüche enthalten.

Das sedSkript ( 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/

Dies implementiert "American Soundex"wie in Wikipedia beschrieben. Das Anfangszeichen wird dadurch nicht geändert (außer es wird gelöscht, wenn es nicht alphabetisch ist), weshalb ich die Zeichenfolgen trim Shell-Skript in Großbuchstaben schreibe.

Dies wurde nicht gründlich getestet, scheint aber die im Wikipedia-Artikel genannten Namen korrekt zu verarbeiten.

Kommentierte Version (die „Schritte“ beziehen sich auf die Schritte im oben genannten Wikipedia-Artikel):

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

Die Suche mit Soundex-Werten ist größtenteils Glückssache.


Auch:

$ 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

verwandte Informationen