在 bash for 循环上进行 glob 扩展时忽略空匹配
Ignore empty matches while glob expanding on bash for loop
我正在编写一个脚本来将文件(例如Dropbox Camera Uploads)移动到年份命名的文件夹,像这样:
#!/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'
我怎样才能忽略不匹配的文件?
您需要 nullglob
选项;不匹配任何内容的模式将被忽略,而不是按字面意思处理。
shopt -s nullglob
for f in *.does_not_exist; do
echo "This won't be reached"
done
您有两个主要选择。正如@chepner 所建议的,一种是打开 nullglob
,这会使不匹配的 glob 扩展为空:
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
测试。
你可以先检查文件是否存在,然后continue
如果不存在则循环
#!/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
[ ! -f "$img" ] && continue
year=${img:0:4}
[ -d "$year" ] || mkdir "$year"
mv -iv "$img" "$year/"
done
我正在编写一个脚本来将文件(例如Dropbox Camera Uploads)移动到年份命名的文件夹,像这样:
#!/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'
我怎样才能忽略不匹配的文件?
您需要 nullglob
选项;不匹配任何内容的模式将被忽略,而不是按字面意思处理。
shopt -s nullglob
for f in *.does_not_exist; do
echo "This won't be reached"
done
您有两个主要选择。正如@chepner 所建议的,一种是打开 nullglob
,这会使不匹配的 glob 扩展为空:
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
测试。
你可以先检查文件是否存在,然后continue
如果不存在则循环
#!/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
[ ! -f "$img" ] && continue
year=${img:0:4}
[ -d "$year" ] || mkdir "$year"
mv -iv "$img" "$year/"
done