Bash中的替代方法,用于检查文件是否存在

时间:2016-03-19 20:23:14

标签: bash

我目前正在运行一个脚本(check_files.sh),该脚本可能会也可能不会生成match *文件(例如match1.txt,match2.txt等。然后我想继续在生成的脚本上运行R脚本匹配*文件。

但是,在运行R脚本之前,我在脚本中尝试了一行来检查文件是否存在。

if [ -s match* ]
            then
            for f in match*
            do
                Rscript --vanilla format_matches.R ${f}
                rm match*
            done
else
            echo "No matches present"
fi

但是,我不断收到错误消息(因为通常会生成很多匹配文件):

./check_files.sh: line 52: [: too many arguments

是否有[-s match *]的替代方法,它不会抛出错误消息?我认为出现了错误消息,因为生成了多个匹配*文件。

3 个答案:

答案 0 :(得分:2)

您可以将逻辑更改为以下内容:

found=0
for f in match*; do
    [ -e "$f" ] || continue
    found=1
    Rscript --vanilla format_matches.R "$f"
    rm "$f"
done

if [ "$found" -eq 0 ]; then
    >&2 echo "No matches present"
fi

答案 1 :(得分:2)

如果您希望文件名包含空格,这有点难看但很强大:

found=0
find -maxdepth 1 -type f -name 'match*' -print0 | while IFS= read -rd $'\0' f
do 
    found=1
    Rscript --vanilla format_matches.R "$f"
    rm "$f"
done

if [ "$found" -eq 0 ]; then
    >&2 echo "No matches present"
fi

答案 2 :(得分:0)

  

是否有[-s match *]的替代方法,它不会抛出错误消息?

以下适用于我的示例文件match1.txt

if [ -f ~/match* ]; then
  echo "yeha"
fi