首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据文件名中的数字索引对目录中的文件进行排序。

根据文件名中的数字索引对目录中的文件进行排序。
EN

Stack Overflow用户
提问于 2011-11-21 11:03:56
回答 4查看 1.2K关注 0票数 3

我在我的脚本中使用了这样的for循环..。

代码语言:javascript
运行
复制
 for var in ipsec_packet*.txt; do
 echo $var
 done

输出

代码语言:javascript
运行
复制
ipsec_packet10.txt
ipsec_packet11.txt
ipsec_packet12.txt
ipsec_packet13.txt
ipsec_packet14.txt
ipsec_packet15.txt
ipsec_packet16.txt
ipsec_packet17.txt
ipsec_packet18.txt
ipsec_packet1.txt
ipsec_packet2.txt
ipsec_packet3.txt
ipsec_packet4.txt
ipsec_packet5.txt
ipsec_packet6.txt
ipsec_packet7.txt
ipsec_packet8.txt
ipsec_packet9.txt

但我希望它们从1开始到最大的avaliable (这里是18),按顺序排列如下..

代码语言:javascript
运行
复制
ipsec_packet1.txt
ipsec_packet2.txt
... 
...
ipsec_packet18.txt

我试过sort -n k14,但没有用。请建议我的排序或任何其他bash/awk功能的变化,可以帮助我。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-21 11:08:54

您可以尝试使用sort和用于在文本中对数字进行自然排序的-V选项。

代码语言:javascript
运行
复制
for var in `ls ipsec_packet*.txt | sort -V`; do  echo $var; done
票数 3
EN

Stack Overflow用户

发布于 2011-11-21 11:56:32

如果GNU不可用(即不支持-V )和如果Perl是可接受的:

代码语言:javascript
运行
复制
perl -le'
  print join $/, 
    map $_->[1], 
      sort { 
        $a->[0] <=> $b->[0] 
        } map [/(\d+)\./, $_], 
          glob shift
  ' '*.txt'

另一种选择是:

代码语言:javascript
运行
复制
printf '%s\n' *.txt |
  sed 's/.*[^0-9]\([0-9]*\)\./\1,&/' |
    sort -n |
      cut -d, -f2-
票数 1
EN

Stack Overflow用户

发布于 2011-11-21 12:42:17

我更喜欢codaddict's solution,但是这里有一个sed+sort技巧,用于当sort没有-V

代码语言:javascript
运行
复制
for var in $(ls ipsec_packet*.txt | sed 's/[0-9]/\t&/' | sort -n -k2 | sed 's/\t//')
do
    echo $var
done

您可以将\t替换为没有出现在输入数据中的任何单个字符,并使用-t指定该字符为sort的字段分隔符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8210733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档