0

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

4 回答 4

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
于 2013-03-07T10:03:31.463 回答
1

您要求输出采用特定格式告诉我您不应该使用 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 *
于 2013-03-07T13:56:13.963 回答
0

如果所有文件名只包含一个_字符,后跟一个数值,这个相对简单的脚本将按数字字段对文件名进行排序,并将它们输出到一个,[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] ] ];
}'
于 2014-04-04T16:00:20.747 回答
-1

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

于 2013-03-07T10:18:47.217 回答