В следующем примере будут сравниваться все файлы в каталоге с входной строкой ($ string) и возвращаться совпадающее имя файла. Это не очень элегантный и эффективный способ сделать это. Из соображений скорости я изменил условие for
, чтобы оно сравнивалось только с файлами, которые начинаются с первого слова строки $.
Проблема с этим скриптом следующая - у меня в каталоге два файла:
Foo Bar.txt
Foo Bar Foo.txt
и я сравниваю их со строкой "Foo Bar 09.20.2010"
. Это вернет оба файла в этом каталоге, так как оба файла совпадают. Но мне нужно вернуть только тот файл, который наиболее точно соответствует строке - в нашем примере это должно быть Foo Bar.txt
.
Также, если у вас есть лучшие идеи, как решить эту проблему, пожалуйста, опубликуйте свои идеи, так как я еще не очень хорошо разбираюсь в сценариях, и я уверен, что есть лучшие и, возможно, даже более простые способы сделать это.
#!/bin/bash
string="Foo Bar 09.20.2010"
for file in /path/to/directory/$(echo "$string" | awk '{print $1}')*; do
filename="${file##*/}"
filename="${filename%.*}"
if [[ $(echo "$string" | grep -i "^$filename") ]]; then
result="$file"
echo $result
fi
done
Вот разбивка того, чего я хочу достичь. Два файла в каталоге для сопоставления с двумя строками. Правильно / неверно в скобках означает, был ли результат, как я ожидал / хотел или нет.
2 Файлы в каталоге (удалены расширения для соответствия):
Foo Bar.txt
Foo Bar Foo.txt
Для сравнения с 2 строками:
Foo Bar Random Additional Text
Foo Bar Foo Random Additional Text
Результаты:
compare "Foo Bar"(.txt) against Foo Bar Random Additional Text -> Match (Correct)
compare "Foo Bar"(.txt) against Foo Bar Foo Random Additional Text -> Match (Incorrect)
compare "Foo Bar Foo"(.txt) against Foo Bar Random Additional Text -> NOT Match (Correct)
compare "Foo Bar Foo"(.txt) against Foo Bar Foo Random Additional Text -> Match (Correct)
Спасибо всем за ваши ответы.