【问题标题】:How to change the order in which files are listed by bash如何更改bash列出文件的顺序
【发布时间】:2020-02-19 09:32:39
【问题描述】:

我有一些文件。当我列出它们时,我得到了订单:

frame0001i0002.png
frame0001.png
frame0002i0003.png
frame0002.png
frame0003i0004.png
frame0003.png
frame0004.png
frame0005.png
frame0006.png

我曾假设frame0001.png 会在frame0001i0002.png 之前,因为我需要按顺序对它们进行操作:

frame0001.png
frame0001i0002.png
frame0002.png
frame0002i0003.png
frame0003.png
frame0003i0004.png
frame0004.png
frame0005.png
frame0006.png

我需要重命名它们以按我想要的顺序显示吗?


最后我想把他们的名字改成:

frame0001.png
frame0002.png
frame0003.png
frame0004.png
frame0005.png
frame0006.png
frame0007.png
frame0008.png
frame0009.png

并按照上面单元格的顺序。

【问题讨论】:

  • 你用什么来列出它们?如果我 cd 到父目录并运行 for file in *.png; do echo "${file##*/}"; done 它会按所需的顺序列出它们。
  • 同样使用findwhile 循环来创建一个数组。例如。 files=(); while read -rd ''; do files+=("${REPLY}"); done < <(find . -name '*.png' -print0) - 数组中的每个文件/成员都按所需顺序索引。您可以通过随后运行declare -p filesprintf '%s\n' "${files[@]}" 来列出它们。

标签: bash filenames


【解决方案1】:

您遇到此问题是因为在您的默认排序顺序中i 位于. 之前。

使用以下命令可以获得预期的顺序:

sort -t'.' -k 1,1

这定义了. 是一个字段分隔符,我们应该只考虑排序顺序的第一个字段(扩展之前的部分)。我们现在将frame0001frame0001i0002 进行比较,最短的将首先打印。

【讨论】:

    【解决方案2】:

    ls 也可以使用-v 选项来做到这一点

    $ ls -vw1 *png
    frame0001.png
    frame0001i0002.png
    frame0002.png
    frame0002i0003.png
    frame0003.png
    frame0003i0004.png
    frame0004.png
    frame0005.png
    frame0006.png
    

    来自ls帮助

    $ ls --help
    ...
      -v                         natural sort of (version) numbers within text
      -w, --width=COLS           set output width to COLS.  0 means no limit
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 2021-01-26
      相关资源
      最近更新 更多