shell脚本:如何测试单个文件的存在

时间:2014-05-09 04:57:40

标签: shell unix scripting

我正在尝试测试特定目录中.doc文件的存在。

    if [ ! -f /home/ankur/*.doc ]
    then echo "no doc files exist."
    else echo "files exist"
    fi

现在如果不存在doc文件或单个doc文件,它可以正常工作。 但是如果有多个doc文件,它仍然可以工作但是会发出一些警告"太多的参数"。 那么如何测试多个doc文件的存在。感谢

3 个答案:

答案 0 :(得分:2)

在您的评论中,您可以扩展原始问题,说:

  

我想要的是,它检查文件并最终产生一个结果。如果没有doc文件那么"不存在doc文件"或者如果有一个或多个文件,则存在" doc文件"

很大程度上取决于你的shell。使用Bash,您可以使用计数器来确定您是否找到了任何匹配的文件。例如:

files=(/home/ankur/*.doc)
files_found=0

for file in "${files[@]}"; do
    [[ -f "$file" ]] && files_found+=1
done

if [[ $files_found == 0 ]]; then
    echo "no doc files exist"
else
    echo "files exist"
fi

关键是使用数组来存储文件名,并一次循环测试一个文件名。然后检查 files_found 变量以查看是否有任何匹配。它适用于我。

答案 1 :(得分:2)

shopt -s nullglob          # if a glob pattern matches no files, 
                           # do NOT return the pattern as a plain string,

files=( /path/to/*.doc )

if (( ${#files[@]} == 0 )); then
    echo "no doc files there"
fi

答案 2 :(得分:1)

如果您只查看天气文件是否存在,那么我猜您应该避免这种麻烦:

你可以简单地做

#!/bin/bash

ls -l /home/ankur/*.doc &>/dev/null
if [[ $? -ne 0 ]]; then
    echo "no doc files exist."
else
  echo "files exist"
fi

还可以使用以下if

来减少一个语句
 if ls home/ankur/*.doc &>/dev/null; then
   echo "files exist"
 else
   echo "no doc files exist."
 fi

为什么要从睡梦中唤醒阵列,如果你不想做任何与他们有关的事情:)