问题:
需要在使用函数对它们进行操作之前对数组进行排序。
首先,数组加载文件:
unset a i
counter=1
while IFS= read -r -d $'\0' file; do
a[i++]="$file"
done < <(find $DIR -type f -print0)
接下来,将数组的每个成员发送到函数
for f in "${a[@]}"
do
func_hash "$f"
[ $(expr $counter % 20) -eq 0 ] && printf "="
counter=$((counter + 1))
done
不知何故,需要将一个排序抛入上面的for循环中。看了看 通过排序数组上的SO帖子,但不知何故我疯狂的文件名 当我尝试进行排序时会引起问题。
想法?
谢谢!
Bubnoff
更新:以下是排序代码:
while IFS= read -r -d $'\0' file; do
func_hash "$file"
[ $(expr $counter % 20) -eq 0 ] && printf "="
counter=$((counter + 1))
done < <(find $DIR -type f -print0 | sort -z +1 -1)
它按完整路径而不是文件名进行排序。关于如何做的任何想法 如果函数需要路径,按文件名排序?
更新2:决定妥协。
我的主要目标是使用sort来避免临时文件。 GNU排序可以回写原文 文件带有'-o'选项,所以现在我可以:
sort -o $OUT -t',' -k 1 $OUT
任何人都有更“优雅”的解决方案(无论这意味着什么)。
已解决请参阅下面的jw013的回答。谢谢你!
答案 0 :(得分:2)
修改强>
while IFS= read -r -d/ && read -r -d '' file; do
a[i++]="$file"
done < <(find "$DIR" -type f -printf '%f/%p\0' | sort -z -t/ -k1 )
理由:
/
永远不是文件名中的合法字符(这在大多数* nix文件系统上似乎是合理的,因为它是路径分隔符)。-printf
用于打印没有前导目录的文件名,然后是带有路径的完整文件名,以/
分隔。排序发生在由/
分隔的第一个字段上,该字段应该是没有路径的完整文件名。 read
被修改为首先使用/
作为分隔符以丢弃无路径文件名。旁注
任何POSIX shell都应支持模运算符作为其算术扩展的一部分。您可以使用
替换第二个循环中对外部命令expr
的调用
[ $(( counter % 20 )) -eq 0 ] ...