查尔斯答案的变体:
有没有任何方法可以控制当我在*中为d运行a时发生的排序;做echo$i;完成;在我的目录中?我有这样的文件夹结构:
root/
|__CloudUtils/
|__ComponentSplit/
|__ComponentStatistics/
|__ETLManager/
|__MergeComponent/
|__NormalizeComponent/
|__Reducer/
我想更改顺序,以便mvn在CloudUtils之后第二次编译NormalizeComponent。
for d in */ ; do
d=${d::-1}
mvn clean deploy -f "$d"
done
有办法做到吗?
shopt -s extglob
exception='NormalizeComponent'
dirs=( !("$exception")/ )
dirs=( "${dirs[0]}" "$exception"/ "${dirs[@]:1}" )
for d in "${dirs[@]}"; do
echo "$d"
done
输出
CloudUtils/
NormalizeComponent/
ComponentSplit/
ComponentStatistics/
ETLManager/
MergeComponent/
Reducer/
只有在存在符合您需要的排序规则的情况下,才能控制排序结果;LC_COLLATE
可以用来选择要使用的顺序,但在这种情况下,您的操作系统提供的任何一个都不会与您想要的行为相匹配。
您可以使用带有否定断言的extglob,将特定目录排除在glob的结果之外,这样您就可以硬编码第一项和第二项,并在排序中执行其他所有操作。区域设置的排序规则设置提供:
#!/usr/bin/env bash
[ -n "$BASH_VERSION" ] || { echo "ERROR: only bash is supported" >&2; exit 1; }
shopt -s extglob
for d in CloudUtils NormalizeComponent !(CloudUtils|NormalizeComponent)/; do
mvn clean deploy -f "${d%/}"
done