删除查找命令的输出 - Shell

Remove output from find command - Shell

我有一个 shell 脚本,它正在我的系统上安装 Tomcat 版本。我可以使用 find 命令将找到的版本打印到 stdout。但是,我也得到了未找到的目录和文件的输出。如何从输出中删除它并仅在输出中显示找到的文件?代码和输出如下。

脚本:

#!/bin/sh
  
APP="Apache Tomcat"

# Common install paths to iterate over
set -- "/opt" "/usr/share" "/var" "/var/lib" "/usr" "/usr/local" 

if [ -x "$(command -v unzip)" ]; then
    for _i in "$@"; do
        find_bootstrap=$(find $_i/tomcat*/bin/ -name bootstrap.jar)
        for found in $find_bootstrap; do
            get_version=$(unzip -p $found META-INF/MANIFEST.MF | grep -Eo 'Implementation-Version: [0-9].[0-9]?.[0-9]?[0-9]?' | grep -Eo '[0-9].[0-9]?.[0-9]?[0-9]?')
            echo "$APP $get_version"
        done
    done
fi

输出:

Apache Tomcat 7.0.82
Apache Tomcat 8.5.30
Apache Tomcat 9.0.31
find: ‘/var/tomcat*/bin/’: No such file or directory
find: ‘/var/lib/tomcat*/bin/’: No such file or directory
find: ‘/usr/tomcat*/bin/’: No such file or directory
find: ‘/usr/local/tomcat*/bin/’: No such file or directory

如果找不到文件,有什么方法可以删除 find: ‘/var/tomcat*/bin/’: No such file or directory

find(与大多数命令一样)在 stderr 上打印错误,因此您可以使用例如将它们与输出分开重定向:

find_bootstrap=$(find $_i/tomcat*/bin/ -name bootstrap.jar 2>/dev/null)

备注: 要找出 Tomcat 的所有安装,我宁愿寻找 catalina.jar(名称冲突的可能性较小),这将提供:

while IFS= read -r -d $'[=11=]' jar; do
    version=$(unzip -p "$jar" META-INF/MANIFEST.MF | grep -oP '(?<=Implementation-Version: )\d+.\d+.\d+');
    echo Apache Tomcat $version
done < <(find /usr /var /opt -name 'catalina.jar' -print0 2>/dev/null)