BASH:用疯狂的名字排序文件数组

时间:2011-08-05 19:35:22

标签: arrays bash sorting find

问题:

需要在使用函数对它们进行操作之前对数组进行排序。

首先,数组加载文件:

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的回答。谢谢你!

1 个答案:

答案 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 ] ...