如何查看 `ls *.xls` 命令是否没有输出?

如何查看 `ls *.xls` 命令是否没有输出?

Ubuntu 14.04.1。

我有一个 bash 脚本,由 cron 每 10 分钟调用一次,它基本上在子目录中查找文件,然后循环并处理每个文件。但是我如何检查是否没有找到文件?如果没有找到文件,我不想处理它们,也不想通过 cron 收到一封说“未找到文件”的电子邮件,因为 cron 每 10 分钟运行一次。这意味着每天有 144 封电子邮件说“未找到文件”,我不想收到。

  • input/ 目录归我所有并具有完全的 rwx 权限。
  • 我已经保证 input/ 中的文件不包含空格,这要感谢 Ask Ubuntu 上的另一个答案。

这是我的基本脚本。

#!/bin/bash
# Cron requires a full path in $myfullpath
myfullpath=/home/comp/progdir
files=`ls $myfullpath/input/fedex*.xlsx`
# How do I check for no files found here and exit without generating a cron email?
for fullfile in $files
do

done

谢谢!我甚至不知道该用 Google 搜索什么。

编辑:我的脚本现在是这样的:

#!/bin/bash
# Script: gocronloop, Feb 5, 2015
# Cron requires a full path to the file.
mydir=/home/comp/perl/gilson/jimv/fedex
cd $mydir/input
# First remove spaces from filesnames in input/
find -name "* *" -type f | rename 's/ /-/g'
cd $mydir
shopt -s nullglob
if [ $? -ne 0 ]; then
    echo "ERROR in shopt"
    exit 1
fi
for fullfile in "$mydir"/input/fedex*.xlsx
    do
    # First remove file extension to get full path and base filename.
    myfile=`echo "$fullfile"|cut -d'.' -f1`
    echo -e "\nDoing $myfile..."
    # Convert file from xlsx to xls.
    ssconvert $myfile.xlsx $myfile.xls
    # Now check status in $?
    if [ $? -ne 0 ]; then
        echo "ERROR in ssconvert"
        exit 1
    fi
    perl $1 $mydir/fedex.pl -input:$mydir/$myfile.xls -progdir:$mydir 
    done

答案1

首先要说的是:不要解析ls

现在我们已经解决了这个问题,使用通配符,以及nullglob

shopt -s nullglob
for fullfile in "$myfullpath"/input/fedex*.xlsx
do
#.......
done

通常,使用通配符时,如果*不匹配任何内容,则保留原样。使用 时nullglob,它会被替换为空,因此不会触发错误匹配。

例如:

$ bash -c 'a=(foo/*); echo ${a[@]}'
foo/*
$ bash -c 'shopt -s nullglob; a=(foo/*); echo ${a[@]}'

$

答案2

如果您坚持要使用ls它,尽管它不适合您原来的代码,或者如果您:

只是想看看是否ls没有找到任何文件

您可以检查它的退出代码。“没有这样的文件...”将失败(退出代码 2)。而即使是空目录ls也会成功(退出代码 0):

$ ls *.xls
ls: cannot access *.xls: No such file or directory
$ echo $?
2

$ ls
$ echo $?
0

答案3

find我们为您完成这些艰苦的工作。编写一个脚本来处理作为第一个参数传递的文件,然后在您的 crontab 中执行以下操作:

find /wherever  -iname 'fedex*.xls' -exec your-script "{}" \;

find如果找不到与表达式匹配的文件,将不会生成任何输出。

答案4

如果你看看 https://stackoverflow.com/questions/2937407/test-whether-a-glob-has-any-matches-in-bash,类似这样的操作应该可以工作:

cd "$myfullpath/input/"

if test -n "$(shopt -s nullglob; echo fedex*.xlsl)"
then
    for file in fedex*.xlsl
    do 
          fullfile="$myfullpath/input/$file"
          # things
    done 
fi 

...另请参阅http://mywiki.wooledge.org/ParsingLs

相关内容