当bash for循环中的glob扩展时忽略空匹配

时间:2016-06-03 19:56:57

标签: bash glob

我正在编写一个脚本来移动文件(例如 Dropbox Camera Uploads )到 年命名文件夹 ,如下所示:< / p>

#!/bin/bash
#
# Separate (camera) images on directory
# to year named folders.
#
# All files must be named as "yyyy-mm-dd HH:MM:SS.ext"
#
for img in *.{jpg,jpeg,png}; do
  year=${img:0:4}
  [ -d "$year" ] || mkdir "$year"
  mv -iv "$img" "$year/"
done

脚本按预期的方式对matchin文件起作用,但是当没有任何扩展名的文件时,扩展为*.ex(前两个扩展字符)。然后它创建空目录,如下所示:

'*.jp'
'*.jp'
'*.pn'

如何忽略没有匹配的文件?

3 个答案:

答案 0 :(得分:3)

您需要nullglob选项;忽略任何与之匹配的模式,而不是按字面意思对待。

shopt -s nullglob
for f in *.does_not_exist; do
    echo "This won't be reached"
done

答案 1 :(得分:1)

您有两个主要选项。正如@chepner建议的那样,其中一个是打开nullglob,这使得无法匹配的globs扩展为null:

shopt -s nullglob

另一种方法是在做任何事情之前测试文件是否存在:

for img in *.{jpg,jpeg,png}; do
  if [ -f "$img" ]; then   # not true for '*.jpg' etc
    year=${img:0:4}
    [ -d "$year" ] || mkdir "$year"
    mv -iv "$img" "$year/"
  fi
done

您也可以使用mkdir -p并跳过-d测试。

答案 2 :(得分:0)

你可以检查文件是否存在,然后OtherPage.aspx循环,如果不是

continue