我遇到了这个bash脚本,用于将包含大写字符的文件名转换为小写字母。
LIST="$(ls)"
for name in "$LIST"; do
if [[ "$name" != *[[:upper:]]* ]]; then
continue
fi
#... remainder omitted
这是我不确定的\*[[:upper:]]\*
字符类。它是否读作零个或多个字符后跟一个大写字母后跟零个或多个字符?
答案 0 :(得分:4)
是强>
*[[:upper:]]*
读作"零个或多个字符后跟一个大写字母后跟零个或多个字符"。请注意,确切地认为是大写字母的内容取决于LC_CTYPE
和LC_ALL
区域设置特定变量的值。
也就是说,如果你想找到并重命名名字中至少有一个大写字母的文件:
for file in *[[:upper:]]*; do
[[ -e $file || -L $file ]] || continue # handle case where glob failed to match
printf 'Found file with at least one upper-case character: %q\n' "$file"
mv -- "$file" "${file,,}" ## move file to its all-lowercase-named equivalent
done
请注意${foo,,}
生成变量内容的全小写形式是一个相当新的功能,在bash 4.x中添加。
请参阅:
ls(1)
${foo,,}
。