列出具有排序顺序的文件名 - ls命令

时间:2013-03-07 10:00:00

标签: bash shell unix sorting ls

我在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

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

4 个答案:

答案 0 :(得分:2)

如果您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

答案 1 :(得分:1)

您要求输出采用特定格式告诉我您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 *

答案 2 :(得分:0)

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

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

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

test_2.txt

答案 3 :(得分:-1)

ls -al | sort + 4n:列出文件  文件大小的升序。即 按第5档排序并显示 最小的文件。