如何让bash脚本检查连续的大写字母



我有一个文件夹,里面有一堆JPEG,我想检查它们的文件名是否符合我的文件名标准:(1(没有空格,(2(没有下划线,(3(没有连续的大写字母,(4(每个文件名都应该以"结尾-原始.jpg";。我输出任何错误的文件名,然后提示用户继续或不继续。下面的脚本适用于条件(1(、(2(和(4(,但我想添加条件(3(作为其他条件。

i=0  # Initialize issue counter
# Detect and indicate any filename issues
for file in *.jpg; do
if [[ $file = *" "* ]] | [[ $file = *"_"* ]]
then
echo "Filename issue: " $file
i=$((i+1))
elif [[ $file != *"-original.jpg" ]] 
then
echo "Filename issue: " $file
i=$((i+1))
fi
done
# If condition satisfied, provide indication of no filename issues
if [[ $i == 0 ]]
then
echo "No filename issues"
fi
echo
# Prompt user if they want to continue with image processing
read -p "Proceed with image processing? (enter 'y' or 'n') " yn
case $yn in
[Yy]* ) 
echo 
echo "PROCEED"
echo
break;;
[Nn]* ) echo; exit;;
* ) echo "Please answer yes or no. ";;
esac

我能够为条件(3(拼凑这些,它检测到连续的大写字母,但我不知道如何使它输出它正在解析的较大字符串($name(和/或将变量传递回较大的shell脚本。最好的方法是什么?

echo "$name" | 
awk '{
for (i=2; i<=NF; i++) {
if ($i ~ /[A-Z]/ && $(i+1) ~ /[A-Z]/) {
echo "capitalization problem"
}
echo "no capitalization problem"
}
}' 

使用bash提供的regexp模式匹配,使用[[ ]]中的=~

if [[ $name =~ [[:upper:]]{2} ]]; then
printf 'Capitalize problem!n'
else
prinf 'No capitalize problem.n'
fi

如@shawn所述,更新为[[:upper:]]{2}

您可以使用一个简单的grep管道来检查锥形大写字符,比如

pax:/> if echo aBbd | grep '[A-Z][A-Z]' >/dev/null ; then echo bad ; fi
pax:/> if echo aBBd | grep '[A-Z][A-Z]' >/dev/null ; then echo bad ; fi
bad

只需用实际的文件名替换正在回显的固定字符串。

您可以使用*[[:upper:]][[:upper:]]*glob:

$ cd "$(mktemp --directory)"
$ touch {a,A}{b,B}{c,C}.jpg
$ ls
abc.jpg  abC.jpg  aBc.jpg  aBC.jpg  Abc.jpg  AbC.jpg  ABc.jpg  ABC.jpg
$ ls *[[:upper:]][[:upper:]]*
aBC.jpg  ABc.jpg  ABC.jpg

这将比循环浏览整个文件列表并单独检查它们的模式快得多。

您可以将其中一些测试组合在一起:

for file in *.jpg; do
if [[ $file =~ [[:space:]_]|[[:upper:]]{2} ]] || [[ $file != *-original.jpg ]]
then
echo "Filename issue: $file"
i=$((i+1))
fi
done

首先使用正则表达式查找空格、下划线或两个连续的大写字母,然后使用通配符模式查看文件是否以-original.jpg结尾。如果任一测试成功,则该文件名无效。如果两者都失败了,那就好了。

为了简单有效地测试(1(没有空格,(2(没有下划线,(3(没有连续的大写字母,(4(每个文件名都应该以"结尾-原始.jpg";在任何shell中使用任何POSIX awk:

awk '
BEGIN {
if ( ARGV[1] == "*.jpg" ) {
exit
}
for (i=1; i<ARGC; i++) {
fname = ARGV[i]
if ( (fname ~ /[[:space:]_]|[[:upper:]]{2}/) || (fname !~ /-original.jpg$/) ) {
gotBad = 1
print "Filename issue:", fname | "cat>&2"
}
}
}
END {
if ( ! gotBad ) {
print "No filename issues" | "cat>&2"
}
exit gotBad
}
' *.jpg

最新更新