【问题标题】:list file names with sorted order - ls command按排序顺序列出文件名 - ls 命令
【发布时间】:2013-03-07 10:00:00
【问题描述】:

我在 UNIX 目录中有一些文件:

/opt/apps/testloc $ ls -mn 
test_1.txt
test_2.txt
test_11.txt
test_12.txt
test_3.txt

我想用ls 命令列出这个,我需要根据文件名末尾的数字按排序顺序输出。说输出应该如下所示。

test_1.txt, test_2.txt, test_3.txt, test_11.txt, test_12.txt

我无法如前所述。这些文件名被视为文本,它们的排序如下,

test_11.txt, test_12.txt, test_1.txt, test_2.txt, test_3.txt

我的命令ls –mn(我需要以逗号分隔的格式输出,所以我使用了-m

我需要这样做以在我的下一个过程中以增量格式处理文件。

【问题讨论】:

    标签: bash shell unix sorting ls


    【解决方案1】:

    如果您的sort 版本可以使用version sort-V 进行操作,那么:

    $ ls | sort -V | awk '{str=str$0", "}END{sub(/, $/,"",str);print str}'
    test_1.txt, test_2.txt, test_3.txt, test_11.txt, test_12.txt
    

    如果不这样做:

    $ ls | sort -t_ -nk2,2 | awk '{str=str$0","}END{sub(/,$/,"",str);print str}'
    test_1.txt, test_2.txt, test_3.txt, test_11.txt, test_12.txt
    

    【讨论】:

    • 将管道添加到tr '\n' ',' 以获取 OP 要求的 csv 列表。
    • @Fredrik 我不喜欢tr '\n' ',',因为它用, 替换了尾随的新行,OP 也想要, ,这不能用tr 完成,所以使用awk你节省了一个管道。
    • 嗨 Sudo_O,我已经用“sort -t”尝试了第二个,但我无法按照我的要求获得.. 输出与前一个相同。 :(
    • @Navin 您是在示例案例中执行ls | sort -t_ -nk2,2,还是文件与您的示例不同?你有什么版本的排序,做sort -v。看到它在这里工作ideone.com/scjYTH
    • 这对我来说是个杀手!在 Ubuntu 14.04 中的工作就像一个魅力。
    【解决方案2】:

    您要求输出采用特定格式告诉我您shouldn't be using ls。由于不需要递归结果,因此请使用 glob。

    # Bash or ksh + GNU or other sort that handles NUL delimiters
    
    function sortFiles {
        [[ -e $1 ]] || return 1
        typeset a x
        for x; do
            printf '%s %s\0' "${x//[^[:digit:]]}" "$x"
        done |
        LC_ALL=C sort -nz - | {
            while IFS= read -rd '' x; do
                a+=("${x#* }")
            done
            typeset IFS=,
            printf '%s\n' "${a[*]}"
        }
    }
    
    sortFiles *
    

    【讨论】:

      【解决方案3】:

      如果所有文件名都恰好包含一个_ 字符,后跟一个数值,这个相对简单的脚本将按数字字段对文件名进行排序,并将它们输出到,[space] 分隔列表中(就像ls -m 所做的那样):

      ls -1 *_* | sort -t_ -n -k2 | sed ':0 N;s/\n/, /;t0'
      

      但是,如果文件名中有多个 _ 字符,并且您希望按最后一个数字字段对它们进行排序(文件名中不一定相同,例如 test_1_3.txttest_2.txt),则更复杂的脚本是必需的:

      ls -1 *_* |
      awk -F '_' '
      {
        key[gensub(/\..*$/, "", 1, $NF) "a" NR] = NR;
        name[NR] = $0;
      }
      END {
        len = asorti(key, keysorted, "@ind_num_asc");
        for (i = 1; i < len; i++) {
          printf "%s, ", name[key[keysorted[i] ] ];
        }
        printf "%s\n", name[key[keysorted[len] ] ];
      }'
      

      【讨论】:

        【解决方案4】:

        ls -al | sort +4n :列出目录中的文件 文件大小的升序。 IE 按第 5 个字段排序并显示 首先是最小的文件。

        【讨论】:

          猜你喜欢
          • 2020-01-16
          • 2017-01-24
          • 2011-11-22
          • 1970-01-01
          • 2019-02-01
          • 2017-04-10
          • 2018-05-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多