bash检查文件是否存在于任何地方

时间:2014-07-07 20:26:43

标签: bash shell

我可以访问包含多个用户帐户的CentOS网络服务器。这些用户可以在自己的文件系统分支中的任何地方拥有php.ini文件 - 而不仅仅是在他们的主目录中。我试图找到一种简单而优雅的方式(最好使用bash实用程序)来测试php.ini文件是否存在于文件系统的单个用户分支中的任何位置。

以下示例显示了我能够设计的两种方法,但每种方法都有其缺点使它们无法使用:

# Does not work as intended
# Always echoes "Found" because find returns 0 even if it didn't find php.ini
if find . -name php.ini; then echo "Found"; fi

# Does not work if php.ini is in a subdirectory
# This test only works on the current working directory
if [ -e php.ini ]; then echo "Found"; fi

假设当前工作目录为〜(/ home / user)且php.ini文件位于〜/ public_html中,则每个目录的输出为:

# First, if the php.ini is named php.ini:
cdsynth@cdsynthetics.com [~]# if find . -name php.ini; then echo "Found"; fi
./public_html/php.ini
Found
# After renaming php.ini to php.ini.bak to test find's exit status:
cdsynth@cdsynthetics.com [~]# if find . -name php.ini; then echo "Found"; fi
Found

# And using the -e file test operator, with php.ini correctly named:
cdsynth@cdsynthetics.com [~]# if [ -e php.ini ]; then echo "Found"; fi

有关如何使用主要使用bash实用程序进行此操作的任何想法?

2 个答案:

答案 0 :(得分:4)

检查find是否输出任何内容:

if [[ $(find . -name php.ini) ]]
then
  echo "Found"
fi

使用GNU find,您还可以在找到匹配项时立即退出:

if [[ $(find . -name php.ini -print -quit) ]]
then
  echo "Found"
fi

答案 1 :(得分:1)

if [ -e "$(find . -name 'php.ini' | head -1)" ] ; then echo "Found"; fi

双引号是必要的,因为[ -e ]以代码0退出。