我有一个处理文件的 bash 脚本。它find
搜索一个目录中的所有文件,并在另一目录中搜索每个文件的名称。为此,它使用
"${myfiletobesearched}"
在脚本里面。但是,如果文件名包含 [ 或 ],脚本将不会在第二个目录中找到它,即使该文件的副本也存在。我该怎么做才能使文件名被识别为相同?
我能够将问题缩小到一个例子。
myfile="My File [Official Awesome File].txt"
find ./ -name "${myfile}" -type f
即使存在具有该名称的文件,也会给出任何输出。\[
当然是写东西或者类似的东西不是一个选择,因为myfile
来自检查目录。
这是脚本:https://gist.github.com/Make42/5bdae5e4de32cff0d01c9486b09383ee
答案1
myfile="My File [Official Awesome File].txt"
myfile=$(echo $myfile | sed -r 's/(\[|\])/\\\1/g')
find ./ -name "${myfile}" -type f
你能检查一下这是否有效吗?
我预计这会将 的值更改myfile
为
myfile="My File \[Official Awesome File\].txt"
更好的是使用printf
:
myfile=$(printf '%q\n' "$myfile")
在您的具体示例中,find
其中将是:
find ./ -name "$(printf '%q\0' "$myfile")" -type f
答案2
寻找的论据-姓名参数是一个全局模式,不是一个文件名和方括号是 glob 模式元字符。
我发现解决这个问题的一种方法是使用内联 perl 脚本,该脚本使用精确的字符串匹配而不是模式:
myfile="My File [Official Awesome File].txt"
perl -MFile::Find -le 'find( sub {
return unless $_ eq $ARGV[0];
print $File::Find::name;
}, $ARGV[1] )' "${myFile}" .