【发布时间】:2010-09-21 07:13:28
【问题描述】:
以下示例将比较目录中的所有文件以输入字符串($string)并返回匹配的文件名。这不是非常优雅和有效的方式来实现这一点。出于速度目的,我修改了for 条件以仅与以 $string 的第一个单词开头的文件进行比较。
此脚本的问题如下 - 我的目录中有两个文件:
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)
谢谢大家的回答。
【问题讨论】:
-
@Andrew - 所以如果有一个完全匹配你想要只是,但是当没有完全匹配时,'部分'匹配会做吗?
-
@martin Clayton 是的,如果没有找到完全匹配,则首选部分匹配。
-
好吧,看来我提供的例子不是最好的。让我再试一次 - 字符串
Foo Bar 09.20.2010应该匹配文件Foo Bar.txt。并且文件Foo Bar Foo 09.20.2010应该匹配文件Foo Bar Foo.txt。我希望这现在更有意义...... -
09.20.2010是什么? -
@John Kugelman 我添加了
09.20.2010表示该字符串可能包含不在文件名中的文本。这主要是我没有使用ls -1的原因。我不使用ls -1的另一个原因是因为我将文件名与字符串进行比较,反之亦然。这就是我首先剥离文件扩展名的原因。
标签: bash compare operator-precedence