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