我在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
)
我需要这样做才能在下一个过程中以增量格式处理文件。
答案 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档排序并显示 最小的文件。