我使用以下代码搜索当前目录中的匹配文件:
# Check for existing backups
EXISTINGFILES="./dropbox-backup-*.tar.gz"
if [[ ! -z "$EXISTINGFILES" ]]
then
echo "Found existing backups!"
# do stuff here...
else
echo "Did not find any existing backups."
fi
这种查找匹配文件的方法允许我使用for f in $EXISTINGFILES
之类的循环迭代匹配,但它永远不会检测到何时找不到匹配的文件。
如何修改上面的代码以检测何时找不到匹配的文件?
答案 0 :(得分:1)
请改用:
EXISTINGFILES=`find . -type f -name 'dropbox-backup-*.tar.gz'`
<强>解释强>
在您的脚本环境中,EXISTINGFILES=./dropbox-backup-*.tar.gz
的问题是,$EXISTINGFILES
总是非零,因为您为其分配了一个值(“./收存箱备份 - *。tar.gz的“)
在上面的解决方案中,我们首先找到文件并将其分配给变量。如果找不到该文件,则该变量将为零,并且您的脚本将转到else
块(即将指示“未找到匹配的文件”)。
答案 1 :(得分:1)
您似乎在寻找nullglob
。说:
shopt -s nullglob
位于脚本的顶部。
$ ls foobar*
ls: foobar*: No such file or directory
$ for i in foobar*; do echo $i; done # Print foobar* if doesn't find match
foobar*
$ shopt -s nullglob
$ for i in foobar*; do echo $i; done # Doesn't print anything if no match found
$
答案 2 :(得分:1)
将existing_files
变为bash数组,并使用nullglob
shopt -s nullglob
existing_files=(./dropbox-backup-*.tar.gz)
if ((${#existing_files[@]})); then echo 'files exist'; fi
答案 3 :(得分:0)
问题是,当您设置EXISTINGFILES
的值以及展开它时,您都引用了星号,因此它永远不会被视为通配符模式。我会跳过变量的使用并单独使用模式:
for f in ./dropbox-backup-*.tar.gz; do
if [[ -f "$f" ]]; then
echo "Found existing backups!"
# do stuff here...
else
echo "Did not find any existing backups."
fi
break
done
如果要存储匹配名称的完整列表,请使用数组:
EXISTINGFILES=( ./dropbox-backup-*.tar.gz )
if [[ -f "${EXISTINGFILES[0]}" ]]; then
默认情况下,匹配0个文件的模式按字面处理,这就是我在上面的示例中使用-f
的原因:测试“文件”(可能是文字模式)实际上是否存在。您可以修改默认行为,以便不匹配的模式简单地消失:
shopt -s nullglob
EXISTINGFILES=( ./dropbox-backup-*.tar.gz )
for f in "${EXISTINGFILES[@]}"; do
# Do stuff; there is at least one matching file if we are in
# the body of the loop
done