测试是否存在多个文件

时间:2013-02-08 04:15:28

标签: bash

如何对任意数量的文件使用test命令,通过regexp

传递参数

例如:

test -f /var/log/apache2/access.log.* && echo "exists one or more files"

但是修剪打印错误: bash:test:参数太多

10 个答案:

答案 0 :(得分:21)

这个解决方案对我来说更直观:

if [ `ls -1 /var/log/apache2/access.log.* 2>/dev/null | wc -l ` -gt 0 ];
then
    echo "ok"
else
    echo "ko"
fi

答案 1 :(得分:4)

要避免“太多参数错误”,您需要xargs。不幸的是,test -f不支持多个文件。以下单行应该有效:

for i in /var/log/apache2/access.log.*; do test -f "$i" && echo "exists one or more files" && break; done

BTW,/var/log/apache2/access.log.*被称为shell-globbing,而不是regexp,请检查:Confusion with shell-globbing wildcards and Regex

答案 2 :(得分:4)

如果您希望将文件列表作为批处理进行处理,而不是对每个文件执行单独的操作,则可以使用find,将结果存储在变量中,然后检查变量是否为空。例如,我使用以下命令编译源目录中的所有.java文件。

SRC=`find src -name "*.java"`
if [ ! -z $SRC ]; then
    javac -classpath $CLASSPATH -d obj $SRC
    # stop if compilation fails
    if [ $? != 0 ]; then exit; fi
fi

答案 3 :(得分:2)

首先,将文件作为数组存储在目录中:

logfiles=(/var/log/apache2/access.log.*)

然后对数组计数进行测试:

if [[ ${#logfiles[@]} -gt 0 ]]; then
  echo 'At least one file found'
fi

答案 4 :(得分:2)

此文件适用于Unofficial Bash Strict Mode,当找不到文件时,no的退出状态为非零。

数组logfiles=(/var/log/apache2/access.log.*)将始终至少包含未扩展的glob,因此可以简单地测试第一个元素的存在:

logfiles=(/var/log/apache2/access.log.*)

if [[ -f ${logfiles[0]} ]]
then 
  echo 'At least one file found'
else
  echo 'No file found'
fi

答案 5 :(得分:0)

ls -1 /var/log/apache2/access.log.* | grep . && echo "One or more files exist."

答案 6 :(得分:0)

您只需要测试ls是否有要列出的内容:

ls /var/log/apache2/access.log.* >/dev/null 2>&1 && echo "exists one or more files"

答案 7 :(得分:0)

主题的变化:

if ls /var/log/apache2/access.log.* >/dev/null 2>&1
then 
  echo 'At least one file found'
else
  echo 'No file found'
fi

答案 8 :(得分:0)

或使用find

if [ $(find /var/log/apache2/ -type f -name "access.log.*" | wc -l) -gt 0 ]; then
  echo "ok"
else
  echo "ko"
fi

答案 9 :(得分:0)

更简单:

if ls /var/log/apache2/access.log.* 2>/dev/null 1>&2; then
   echo "ok"
else
   echo "ko"
fi