bash 脚本无法正确将文件名与 [ 和 ] 进行比较

bash 脚本无法正确将文件名与 [ 和 ] 进行比较

我有一个处理文件的 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}" .

相关内容