我想知道如何在条件表达式中使用通配符

时间:2014-03-07 18:38:07

标签: bash

我有一个可能包含多种文件类型的目录。我正在尝试使用条件表达式,只有在目录中存在某些文件类型时才执行操作。

例如,如果存在xml文件,则将它们移动到其他位置。以下陈述不起作用,我不知道为什么。

[ -e *.xml ] && mv *.xml ../xml

我也试过双括号但没有成功。有什么建议/解释吗?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用find执行此操作,无需检查其存在。如果存在,他们将被移动,否则命令将结束而没有任何错误:

find . -name "*.xml" -type f -exec mv {} /path/to/dest/ \;

答案 1 :(得分:2)

-e运算符需要单个文件,但*.xml可以扩展为多个文件。没有一种真正好的方法可以单独用shell来处理它;我会使用find

find -name '*.xml' -execdir mv '{}' ../xml +

一个仅限shell的解决方案是滥用for循环:

for f in *.xml; do
    [[ -f "$f" ]] && mv *.xml ../xml
    break
done

这不会迭代,但它允许f设置为一个或多个匹配中的第一个匹配,或者设置为文字字符串*.xml。无论哪种方式,仅当至少一个文件与模式匹配时才执行mv命令,然后我们退出循环。如果模式不匹配,可以使用nullglob选项永远不要进入循环:

shopt -s nullglob
for f in *.xml; do
    mv *.xml ../xml
    break
done

您也可以使用数组:

files=( *.xml )
[[ -f "${files[0]}" ]] && mv *.xml ../xml

或位置参数

set -- *.xml
[[ -f $1 ]] && mv *.xml