【问题标题】:BASH: Sort array of files with crazy namesBASH:对具有疯狂名称的文件数组进行排序
【发布时间】:2011-08-05 19:35:21
【问题描述】:

问题:

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

首先,数组加载文件:

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帖子,但不知何故我疯狂的文件名 当我尝试进行排序时会导致问题。

想法?

谢谢!

布布诺夫

更新:这是带有排序的代码:

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:决定妥协。

我的主要目标是避免使用排序的临时文件。 GNU sort 可以写回原来的 带有'-o'选项的文件,所以现在我可以:

sort -o $OUT -t',' -k 1 $OUT

任何人都有更“优雅”的解决方案(无论这意味着什么)。

已解决请参阅下面的 jw013 的答案。谢谢大佬!

【问题讨论】:

  • 我们需要文件名和所需的排序顺序(捕获一些常规和所有异常情况的示例)。祝你好运。
  • 您也没有链接到您尝试过的 SO 帖子。我的第一直觉是将find 输出通过管道传递到&lt;() 中的sort,这对时髦的文件不起作用吗?
  • nhed - 不,它没有。我会再试一次并发布错误。
  • shellter - 带有空格和逗号的超长文件名。 Alpha 排序。
  • 决定即时进行袋子分拣。已经决定做一个'sort -o'。想要避免 tmp 文件。接受建议。

标签: arrays bash sorting find


【解决方案1】:

编辑

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 都应该支持模运算符作为其算术扩展的一部分。您可以在第二个循环中将 line 替换为调用外部命令 expr

[ $(( counter % 20 )) -eq 0 ] ...

【讨论】:

  • 那种。请参阅上面的更新。 Find 返回完整路径并按完整路径对“排序”进行排序。我需要在循环中保留完整路径的同时按文件名排序,以便将完整路径传递给函数。
  • 非常出色!完美运行。不过,它比单独的“排序”要慢得多。谢谢!
  • 我收回关于速度的评论。几次运行表明它的平均速度大致相同。再次感谢!
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2018-06-03
  • 2010-11-13
  • 2011-10-24
相关资源
最近更新 更多