Bash检查我的星号扩展是否有任何匹配

时间:2014-03-05 03:22:36

标签: regex bash if-statement

我使用以下代码搜索当前目录中的匹配文件:

# 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之类的循环迭代匹配,但它永远不会检测到何时找不到匹配的文件。

如何修改上面的代码以检测何时找不到匹配的文件?

4 个答案:

答案 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