我有一个可能包含多种文件类型的目录。我正在尝试使用条件表达式,只有在目录中存在某些文件类型时才执行操作。
例如,如果存在xml文件,则将它们移动到其他位置。以下陈述不起作用,我不知道为什么。
[ -e *.xml ] && mv *.xml ../xml
我也试过双括号但没有成功。有什么建议/解释吗?
感谢。
答案 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