有时我需要搜索带有重音字符(一般是变音符号)的文件,通常使用locate(mlocate风格,合并定位;请参阅下面与 plocate 相关的警告)。我希望进行设置(可能在/etc/updatedb.conf
),以便它允许我使用某种语言映射搜索这些特殊字符,例如:
a == âàáäÂÀÂÄ
e == êèéëÊÈÉË
i == îïíÎÏ
o == ôöóÔÖ
u == ûùüÛÜÙ
c == çÇ
n == ñ
因此locate -i liberación
也应该搜索带有字符串的文件名解放报乃至解放。
注释和假设
- 也许还有其他:ÂÃÄÀÁÅÆ ÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖØÙÚÛÜÝÞ ßàáâäåç èéêëìíîïðñòóôõö øùúûüýþÿ。
- 这是罗曼语例如西班牙语、法语和德语。
- 我总是使用 100% UTF-8 语言环境。
- 我宁愿不使用正则表达式。
- 补丁可能会使用 Unicode 的 ASCII 音译作为统一编码/统一编码确实如此。mlocate 的大部分代码都是用 C 编写的。
有关的
- 类似的问题但使用
find
- Miloslav Trmač(
mlocate
开发人员)在这里说官方源代码位于 pagure.io(和Github 上的一个 fork)。 - 我提交Pagure.io 上的 mlocate repo 存在问题添加此功能。
答案1
如果我们看一下updatedb.conf(5)
,我们会发现我们对配置项无能为力。
因此我们将使用编写一个脚本locate
;最后我们可以运行类似my-locate.sh liberacion
或的程序my-locate.sh liberâciòn
,它将为我们提供所有可能的组合。
开始吧
首先在您想要的任何位置创建一个简单的文件作为我们的数据库,例如:~/.mydb
;然后将您的重音字符添加到该文件中,如下所示:
aâàáäÂÀÂÄ
eêèéëÊÈÉË
iîïíÎÏ
uûùüÛÜÙ
cçÇ
oôöóÔÖóòòò
...
...
然后我们需要一个可以为我们完成这项工作的小脚本,我写了一个简单的脚本:
#!/bin/bash
# Final search term
STR=""
# Loop throughout all characters of desired string
for (( i=0; i<${#1}; i++ )); do
# Split the string in one char
CH="${1:$i:1}"
# Find all possible combinations of this char
CHARS=$(grep "$CH" ~/.mydb)
# Add an "or" operator between characters
REG=$(echo "$CHARS" | sed 's/.\{1\}/&\|/g' )
REG="($REG)"
# Append all possible combination of this character
# to our final search term as an or statement
if [ "$REG" == '()' ];
then
STR=$STR$CH
else
STR=$STR$REG
fi
done
# locate it using regex
locate --regex "$STR$"
现在用所需的名称将其保存在 PATH 中的某个位置,例如:~/bin
。它应该已经存在于您的 PATH 环境中。
毕竟,只需使用类似这样的东西来搜索所有可能的组合。
my-locate.sh liberacion
将为我找到所有这些:
~/lab/liberacion
~/lab/liberaciòn
~/lab/liberación
~/lab/liberâciòn
~/lab/liberäciòn
~/lab/libÈrâciòn
答案2
移动定位
现在移动定位0.26 我们有-t --transliterate
选择(见手册页)在 Ubuntu 18.04+ 上(无需解决方法):
创建一些测试文件:
$ touch liberación liberacion liberaciôn
更新和搜索:
$ updatedb
$ locate --transliterate liberacion
/home/pablo/liberacion
/home/pablo/liberación
/home/pablo/liberaciôn
所以现在locate -t liberación
还可以搜索带有字符串的文件liberacion
,甚至liberaciòn
!
最后,创建一个别名...:-)
$ alias locate="locate --transliterate"
定位
定位:是更快定位和较小的指数。但没有--transliterate
选择,并且短期内也不会有,正如其唯一维护者 (Steinar Gunderson) 所说:
不幸的是,这非常不简单。mlocate 可以避免这种情况,因为它会线性扫描每个文件名;而 plocate 则不能,这就是为什么它比 mlocate 快得多,但也使这种依赖于语言环境的搜索变得更加困难。所以不幸的是,这种情况不太可能很快发生。
我找不到与该项目相关的问题跟踪器。
但它有--regex
,所以内部似乎可以使用类似的东西Ravexina 的方法。
在plocate
默认情况下,我在发行版中将其删除,安装了 mlocate 并保留它,以便不会被 plocate 替换:
sudo apt update && sudo apt upgrade
wget "http://archive.ubuntu.com/ubuntu/pool/main/m/mlocate/mlocate_0.26-3ubuntu3_amd64.deb"
sudo apt install -f
sudo apt-mark hold mlocate