Bash:参数中的通配符扩展为文件名

时间:2018-09-18 11:42:39

标签: regex bash arguments

这是我的脚本:

#!/bin/bash
set -x
arguments="some explanation"

if [[ $1 == -f ]]; then
    exiftool '-FileName<DateTimeOriginal' -d "%Y-%m-%d %H,%M,%S.%%e" "$2"
elif [[ $1 == -d ]]; then
    exiftool -d %Y-%m "-directory<datetimeoriginal" "$2"
elif [[ $1 == -fd ]]; then
    exiftool '-FileName<DateTimeOriginal' -d "%Y-%m-%d %H,%M,%S.%%e" "$2"
    exiftool -d %Y-%m "-directory<datetimeoriginal" "$2"
elif [[ $1 == -p ]]; then
    exiftool '-FileName<DateTimeOriginal' -d "%Y-%m-%d.%%e" "$2"
else
    echo -e $arguments
fi
set +x

如果我运行exifrename -f .,它将重命名当前文件夹中的所有文件。但是,假设我有以下3个文件:

IMAG01234.jpg
IMAG01235.jpg
拉尔夫在家.jpg

并与他们一起运行`exifrename -f IMAG *。它只会重命名一个 IMAG文件。

调试该脚本时,会看到以下内容:

+ [[ -d == -f ]]
+ [[ -d == -d ]]
+ exiftool -d %Y-%m '-directory<datetimeoriginal' IMAG01235.jpg

如何使最后一行显示IMAG *而不是IMAG01235?

1 个答案:

答案 0 :(得分:1)

在执行IMAG *时,bash shell会进行定位并将IMAG *扩展为2个文件,并将它们作为参数传递给脚本。您需要遍历所有命令行参数:

示例:

sed

在您的情况下,您可以执行以下假设,即始终只有一个选项,然后是文件列表。

s

注意:如果您对bash脚本感到满意,那么使用case / esac而不是if / else会更容易阅读。