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::Soundex
Modul), anstatt dies zu verwenden.
Das folgende Shell-Skript und das zugehörige sed
Skript 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 sed
Skripts (unten). Anschließend sucht es find
nach 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.sed
Skript den absoluten Pfad hinzufügt. In seiner jetzigen Form erfordert es, dass sich das sed
Skript im aktuellen Verzeichnis befindet. Es unterstützt auch keine Dateinamen, die Zeilenumbrüche enthalten.
Das sed
Skript ( 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 tr
im 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