【问题标题】:ordering in bash "for" loop在 bash "for" 循环中排序
【发布时间】:2026-01-28 09:45:02
【问题描述】:

有什么方法可以控制我运行时发生的排序, 对于我在 * ;做;回声 $i;完毕; 在我的目录中。 它似乎总是使用 ascii 排序。无论如何要进行数字排序?

谢谢, 维韦克

【问题讨论】:

    标签: bash unix sorting


    【解决方案1】:

    您始终可以使用 sort(1) 及其数字排序:

    for i in $(ls -1 * | sort -n) ; do echo $i ; done
    

    【讨论】:

    • * 也是如此。实际上,不,这不是多余的;它会列出子目录的内容,这可能不是你想要的。
    • -1 强制单列输出,但是当ls 的输出进入管道时无论如何都会发生这种情况。可能有用的是-d 列出目录而不列出目录的内容。
    • 循环通过 $(ls -1 *) 是有问题的。如果文件名使用空格或换行符,您将得到时髦(甚至是灾难性)的结果。
    • 另见useless use of lsmywiki.wooledge.org/ParsingLs;简单的修复类似于printf '%s\n' * | sort -n | while IFS= read -r i; do ...,但如果您的文件名中包含换行符,它也会失败。
    【解决方案2】:

    如何使您的文件名自然排序为数字,即用前导零填充。代替1 .. 10 .. 100,使用001 ..010 .. 100?

    要包含子目录:

    for i in $( ls -d * | sort -n ); do echo $i; done;
    

    排除子目录:

    for i in $( ls | sort -n ); do echo $i; done;
    

    我希望这会有所帮助。

    【讨论】:

    • @samdy1 :感谢结束。你说得对。我在想什么!? ;-) 祝你好运。
    【解决方案3】:

    您可以使用您为目录指定的 ls [排序选项] 中的排序 即

          for i in `ls -X` ; do
                 echo $i
          done
    

    首先执行具有特定排序的 ls 命令,在示例情况下排序扩展,然后您给出带有 for 循环的列表

    【讨论】:

      【解决方案4】:
      for i in $(ls | sort -n) ; do echo $i ; done
      

      【讨论】: