2013-03-07 39 views
0

我有一个UNIX目录中的某些文件:与排序的顺序列表文件名 - ls命令

/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

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

回答

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 
+0

添加一个管道到'tr'\ n'',''得到一个csv-list,如OP所要求的。 – 2013-03-07 10:09:33

+0

现在你已经过分复杂化了:-)。 +1尽管如此, – 2013-03-07 10:33:54

+0

@Fredrik我不喜欢'tr'\ n'','',因为它用'替换了后面的新行,'同样希望'''不能用'tr'完成,所以通过使用'awk'你保存一个管道。 – 2013-03-07 10:38:49

-1

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

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 * 
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] ] ]; 
}'