Shell脚本 - 不区分大小写的匹配

时间:2014-01-29 17:06:10

标签: windows shell find case-sensitive case-insensitive

这个程序:

#!/bin/bash

find teste1 -type f -iname "**" | while read -r firstResult
do
find teste2 -type f -iname "**" | while read -r secondResult
do
firstName=${firstResult##*[/|\\]}
secondName=${secondResult##*[/|\\]}
if [[ $firstName == $secondName ]]; then
echo "$firstResult" "$secondResult" >> equal.lst
else
echo "$firstResult" "$secondResult" >> notEqual.lst
fi
done
done

我有一点问题,它工作得很好,但是,当文件夹就像这个例子:/teste1/TESTE.pub /teste2/TEstE.pub,它没有把文件放在上面“等于”。我怎样才能做到这一点?我一直试图在没有区分大小写的情况下进行查找,这意味着它应该可以工作,但它只是不承认。

请帮忙。

也许我应该将所有文件名“转换”为其中一个案例然后进行搜索?你认为这会解决我的问题吗?在逻辑方面,它会起作用,因为所有文件都具有相同的外壳。

2 个答案:

答案 0 :(得分:1)

好的,所以,我通过将所有文件名更改为小写来解决我遇到的问题。

#!/bin/bash

find teste1 -type f | tr [A-Z] [a-z] | while read -r firstResult
do
find teste2 -type f | tr [A-Z] [a-z] | while read -r secondResult
do
firstName=${firstResult##*[/|\\]}
secondName=${secondResult##*[/|\\]}
if [[ $firstName == $secondName ]]; then
echo "$firstResult" "$secondResult" >> equal.lst
else
echo "$firstResult" "$secondResult" >> notEqual.lst
fi
done
done

现在可以完全按照我的意愿匹配和保存文件。如果其他人想知道,如果您希望此FIND区分大小写,请删除tr [A-Z] [a-z]命令。

答案 1 :(得分:1)

无需使用tr,bash有自己的内置案例转换(${var,,})。此外,查找不需要-iname **,默认情况下将其保留为匹配所有文件。

#!/bin/bash

find teste1 -type f | while read -r firstResult
do
  find teste2 -type f | while read -r secondResult
  do
    firstName="${firstResult##*[/|\\]}"
    secondName="${secondResult##*[/|\\]}"

    if [[ "${firstName,,}" == "${secondName,,}" ]]; then
      echo "$firstResult" "$secondResult" >> equal.lst
    else
      echo "$firstResult" "$secondResult" >> notEqual.lst
    fi
  done
done