Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 按排序顺序列出文件名-ls命令_Bash_Shell_Unix_Sorting_Ls - Fatal编程技术网

Bash 按排序顺序列出文件名-ls命令

Bash 按排序顺序列出文件名-ls命令,bash,shell,unix,sorting,ls,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.tx

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


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

如果您的
排序版本可以使用
-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

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

如果您要求以特定格式输出,则告诉我您需要。因为递归结果不是必需的,所以使用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 *

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

但是,如果文件名中有多个
字符,并且您希望按最后一个数字字段对它们进行排序(在文件名中不一定相同,例如
test_1_3.txt
test_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] ] ];
}'
ls-1*.*|
awk-F'u''
{
键[gensub(/\..*$/,“”,1,$NF)“a”NR]=NR;
姓名[编号]=$0;
}
结束{
len=asorti(key,keysorted,“@ind_num_asc”);
对于(i=1;i
添加一个管道到
tr'\n'',
以获取OP要求的csv列表。@Fredrik我不喜欢
tr'\n'',
,因为它用
替换了尾随的新行,
以及OP想要的
,这是
tr
无法完成的,所以使用
awk
可以保存管道。嗨,Sudo\O,我用“sort-t”我无法按要求获取..输出与前一个相同:(@Navin您是在示例案例中执行ls | sort-t -nk2,2
还是文件与您的示例不同?您有什么版本的sort,do
sort-v
。看看它在这里的工作情况这对我来说是个杀手!在Ubuntu 14.04中工作得很有魅力。
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] ] ];
}'