Bash 按排序顺序列出文件名-ls命令
我在UNIX目录中有一些文件: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
/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,dosort-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] ] ];
}'